{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Amazon Product Sentiment Analysis\n",
    "\n",
    "Project: Amazon product recommender system   \n",
    "Team: The Mean Squares  \n",
    "\n",
    "This notebook gives a descripton of    \n",
    "a. Performing the sentiment analysis using the following techniques: Logistic regression, Logistic regression with TFIDF vectorizer and Logistic regression with TFIDF vectorizer and n-grams techniques\n",
    "b. Analysing the accuracy of the models and determining the best approach    \n",
    "c. Identifying the highest-used words in each set of reviews, when grouped by rating"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "     \n",
    "## Importing the libraries     \n",
    "    \n",
    "First step is to import all the libraries required"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Importing the required libraries\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.dummy import DummyClassifier\n",
    "from string import punctuation\n",
    "from sklearn import svm\n",
    "from nltk.corpus import stopwords\n",
    "from nltk.stem import WordNetLemmatizer\n",
    "import nltk\n",
    "from nltk import ngrams\n",
    "from itertools import chain\n",
    "from wordcloud import WordCloud\n",
    "from fractions import Fraction\n",
    "import re"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Reading the data\n",
    "\n",
    "Now, we are reading the reviews_merged.json file into dataframe and adding new columns to perform the efficiency of helpfulness metrics     \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#Read the file and add new columns helpfulnessnumerator and helpfulnessdenominator\n",
    "reviews = pd.read_json('reviews_merged.json')\n",
    "reviews[['HelpfulnessNumerator','HelpfulnessDenominator']] = pd.DataFrame(reviews.helpful.values.tolist(), index = reviews.index)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preprocessing \n",
    "\n",
    "We remove the duplicates if any, based on the reviewerID, productID (asin) and unix timestamp. Adding the upvote metrics to analyze the dataset    \n",
    "     "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>asin</th>\n",
       "      <th>helpful</th>\n",
       "      <th>overall</th>\n",
       "      <th>reviewText</th>\n",
       "      <th>reviewTime</th>\n",
       "      <th>reviewerID</th>\n",
       "      <th>reviewerName</th>\n",
       "      <th>summary</th>\n",
       "      <th>unixReviewTime</th>\n",
       "      <th>HelpfulnessNumerator</th>\n",
       "      <th>HelpfulnessDenominator</th>\n",
       "      <th>Helpful %</th>\n",
       "      <th>% Upvote</th>\n",
       "      <th>Id</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[3, 4]</td>\n",
       "      <td>1</td>\n",
       "      <td>Very oily and creamy. Not at all what I expect...</td>\n",
       "      <td>01 30, 2014</td>\n",
       "      <td>A1YJEY40YUW4SE</td>\n",
       "      <td>Andrea</td>\n",
       "      <td>Don't waste your money</td>\n",
       "      <td>1391040000</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>3</td>\n",
       "      <td>This palette was a decent price and I was look...</td>\n",
       "      <td>04 18, 2014</td>\n",
       "      <td>A60XNB876KYML</td>\n",
       "      <td>Jessica H.</td>\n",
       "      <td>OK Palette!</td>\n",
       "      <td>1397779200</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>4</td>\n",
       "      <td>The texture of this concealer pallet is fantas...</td>\n",
       "      <td>09 6, 2013</td>\n",
       "      <td>A3G6XNM240RMWA</td>\n",
       "      <td>Karen</td>\n",
       "      <td>great quality</td>\n",
       "      <td>1378425600</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[2, 2]</td>\n",
       "      <td>2</td>\n",
       "      <td>I really can't tell what exactly this thing is...</td>\n",
       "      <td>12 8, 2013</td>\n",
       "      <td>A1PQFP6SAJ6D80</td>\n",
       "      <td>Norah</td>\n",
       "      <td>Do not work on my face</td>\n",
       "      <td>1386460800</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>3</td>\n",
       "      <td>It was a little smaller than I expected, but t...</td>\n",
       "      <td>10 19, 2013</td>\n",
       "      <td>A38FVHZTNQ271F</td>\n",
       "      <td>Nova Amor</td>\n",
       "      <td>It's okay.</td>\n",
       "      <td>1382140800</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[1, 2]</td>\n",
       "      <td>5</td>\n",
       "      <td>I was very happy to get this palette, now I wi...</td>\n",
       "      <td>04 15, 2013</td>\n",
       "      <td>A3BTN14HIZET6Z</td>\n",
       "      <td>S. M. Randall \"WildHorseWoman\"</td>\n",
       "      <td>Very nice palette!</td>\n",
       "      <td>1365984000</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[1, 3]</td>\n",
       "      <td>1</td>\n",
       "      <td>PLEASE DONT DO IT! this just rachett the palet...</td>\n",
       "      <td>08 16, 2013</td>\n",
       "      <td>A1Z59RFKN0M5QL</td>\n",
       "      <td>tasha \"luvely12b\"</td>\n",
       "      <td>smh!!!</td>\n",
       "      <td>1376611200</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>20-40%</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7806397051</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>2</td>\n",
       "      <td>Chalky,Not Pigmented,Wears off easily,Not a Co...</td>\n",
       "      <td>09 4, 2013</td>\n",
       "      <td>AWUO9P6PL1SY8</td>\n",
       "      <td>TreMagnifique</td>\n",
       "      <td>Chalky, Not Pigmented, Wears off easily, Not a...</td>\n",
       "      <td>1378252800</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>2</td>\n",
       "      <td>Did nothing for me. Stings when I put it on. I...</td>\n",
       "      <td>07 13, 2014</td>\n",
       "      <td>A3LMILRM9OC3SA</td>\n",
       "      <td>NaN</td>\n",
       "      <td>no Lightening, no Brightening,......NOTHING</td>\n",
       "      <td>1405209600</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>3</td>\n",
       "      <td>I bought this product to get rid of the dark s...</td>\n",
       "      <td>12 27, 2013</td>\n",
       "      <td>A30IP88QK3YUIO</td>\n",
       "      <td>Amina Bint Ibraheem</td>\n",
       "      <td>Its alright</td>\n",
       "      <td>1388102400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>3</td>\n",
       "      <td>I have mixed feelings about this product. When...</td>\n",
       "      <td>05 20, 2014</td>\n",
       "      <td>APBQH4BS48CQO</td>\n",
       "      <td>Charmmy</td>\n",
       "      <td>Mixed feelings.</td>\n",
       "      <td>1400544000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>1</td>\n",
       "      <td>Did nothing for my skin. Used as suggested and...</td>\n",
       "      <td>02 18, 2014</td>\n",
       "      <td>A3FE8W8UV95U6B</td>\n",
       "      <td>Culture C Simmons</td>\n",
       "      <td>Nothing</td>\n",
       "      <td>1392681600</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>I bought this product about 3 months ago, I fi...</td>\n",
       "      <td>01 23, 2014</td>\n",
       "      <td>A1EVGDOTGFZOSS</td>\n",
       "      <td>Jessica \"Anarchykisses\"</td>\n",
       "      <td>This works</td>\n",
       "      <td>1390435200</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>1</td>\n",
       "      <td>This gell did nothing at all. I religiously pu...</td>\n",
       "      <td>01 11, 2014</td>\n",
       "      <td>AP5WTCMP6DTRV</td>\n",
       "      <td>Layla B</td>\n",
       "      <td>Does nothing</td>\n",
       "      <td>1389398400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>i got this to get rid of a scar and it did jus...</td>\n",
       "      <td>02 18, 2014</td>\n",
       "      <td>A21IM16PQWKVO5</td>\n",
       "      <td>mdub9922</td>\n",
       "      <td>it works</td>\n",
       "      <td>1392681600</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>2</td>\n",
       "      <td>I used it for anal bleaching and it burned a b...</td>\n",
       "      <td>04 6, 2014</td>\n",
       "      <td>A1TLDR1V4O48PK</td>\n",
       "      <td>Mickey O Neil \"Mickey O Neil\"</td>\n",
       "      <td>burns</td>\n",
       "      <td>1396742400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[2, 4]</td>\n",
       "      <td>5</td>\n",
       "      <td>I order this cream along with their soap. It a...</td>\n",
       "      <td>09 14, 2013</td>\n",
       "      <td>A6F8KH0J1AVYA</td>\n",
       "      <td>SanBen</td>\n",
       "      <td>Did work for me</td>\n",
       "      <td>1379116800</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[2, 4]</td>\n",
       "      <td>4</td>\n",
       "      <td>Good product. Use a little bit on your spot an...</td>\n",
       "      <td>10 18, 2013</td>\n",
       "      <td>AXPKZA7UZXKTT</td>\n",
       "      <td>Shirleyyy</td>\n",
       "      <td>excellent</td>\n",
       "      <td>1382054400</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>9759091062</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>3</td>\n",
       "      <td>I didn't use it past a week. The reason why is...</td>\n",
       "      <td>11 1, 2013</td>\n",
       "      <td>A2SIAYDK7GG7QA</td>\n",
       "      <td>theredtranny</td>\n",
       "      <td>weird smell</td>\n",
       "      <td>1383264000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>9788072216</td>\n",
       "      <td>[24, 24]</td>\n",
       "      <td>5</td>\n",
       "      <td>I haven't been a big fan of Prada's fragrances...</td>\n",
       "      <td>09 19, 2011</td>\n",
       "      <td>A1QV5IH6HDRN0L</td>\n",
       "      <td>armygirl</td>\n",
       "      <td>Love the smell of this!</td>\n",
       "      <td>1316390400</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9788072216</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>We gave these as gifts and everyone that recei...</td>\n",
       "      <td>08 10, 2013</td>\n",
       "      <td>A3UQXHI88S7XAX</td>\n",
       "      <td>D. Greene</td>\n",
       "      <td>Happy</td>\n",
       "      <td>1376092800</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9788072216</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>This is the first fragrance by Prada that I lo...</td>\n",
       "      <td>11 28, 2011</td>\n",
       "      <td>A2EK2CJNJUF7OQ</td>\n",
       "      <td>Nikki</td>\n",
       "      <td>Very good</td>\n",
       "      <td>1322438400</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>9788072216</td>\n",
       "      <td>[2, 4]</td>\n",
       "      <td>5</td>\n",
       "      <td>So I got this about a month ago. I had no plan...</td>\n",
       "      <td>05 27, 2012</td>\n",
       "      <td>A2GWNGQF9SHRE4</td>\n",
       "      <td>Pholuke \"Lepa Shandy\"</td>\n",
       "      <td>Lurrrrrrrrv.....</td>\n",
       "      <td>1338076800</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>9788072216</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>This product has a very fruity scent which is ...</td>\n",
       "      <td>02 2, 2013</td>\n",
       "      <td>ABV67T136UXFQ</td>\n",
       "      <td>Sandra</td>\n",
       "      <td>Great Scent</td>\n",
       "      <td>1359763200</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>I'm very picky when it comes to fragrance. I l...</td>\n",
       "      <td>03 11, 2014</td>\n",
       "      <td>A2FQZKL2KIZACO</td>\n",
       "      <td>Ellie B.</td>\n",
       "      <td>Spring Garden in a Bottle</td>\n",
       "      <td>1394496000</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>3</td>\n",
       "      <td>bright crystals reminds me of Victoria Secrets...</td>\n",
       "      <td>12 19, 2011</td>\n",
       "      <td>A312RDWQYLAG7S</td>\n",
       "      <td>ltg</td>\n",
       "      <td>fresh smell</td>\n",
       "      <td>1324252800</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>Got this product and I never heard of this so ...</td>\n",
       "      <td>09 8, 2013</td>\n",
       "      <td>A3TYR1ALBZ2EU9</td>\n",
       "      <td>Mananagirl6</td>\n",
       "      <td>My new smell!</td>\n",
       "      <td>1378598400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>This is a beautiful perfume! Nice, clean scent...</td>\n",
       "      <td>02 2, 2014</td>\n",
       "      <td>AUYVMLI0CBMYS</td>\n",
       "      <td>Shay1234</td>\n",
       "      <td>One of my favs!</td>\n",
       "      <td>1391299200</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[1, 2]</td>\n",
       "      <td>5</td>\n",
       "      <td>This is the real Versace Bright Crystal fragra...</td>\n",
       "      <td>02 14, 2014</td>\n",
       "      <td>A2H0VDRANZMGGX</td>\n",
       "      <td>Shoe luva</td>\n",
       "      <td>Smells clean</td>\n",
       "      <td>1392336000</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>9790790961</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>3</td>\n",
       "      <td>I love it! and will continue using it but it's...</td>\n",
       "      <td>02 12, 2014</td>\n",
       "      <td>A2MZDI3I5AEL74</td>\n",
       "      <td>Y. Siani \"I love nini\"</td>\n",
       "      <td>Love the smell but a shame it's not last as long</td>\n",
       "      <td>1392163200</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477149</th>\n",
       "      <td>B00KA602SY</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>I really like this shirt, very comfortable and...</td>\n",
       "      <td>06 22, 2014</td>\n",
       "      <td>ANNHM5C3DX72Q</td>\n",
       "      <td>Tracey Simmons</td>\n",
       "      <td>Very nice</td>\n",
       "      <td>1403395200</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477150</th>\n",
       "      <td>B00KCWMG5S</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>2</td>\n",
       "      <td>For tiny teenagers.</td>\n",
       "      <td>07 20, 2014</td>\n",
       "      <td>A2FENE35P9Z592</td>\n",
       "      <td>Amanda</td>\n",
       "      <td>Teeny pants</td>\n",
       "      <td>1405814400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477151</th>\n",
       "      <td>B00KCWMG5S</td>\n",
       "      <td>[2, 2]</td>\n",
       "      <td>4</td>\n",
       "      <td>Like these pants, 1st time I wore them I rippe...</td>\n",
       "      <td>06 6, 2014</td>\n",
       "      <td>AODACROYFBAY</td>\n",
       "      <td>Denise M Nelson</td>\n",
       "      <td>fabric is thin</td>\n",
       "      <td>1402012800</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477152</th>\n",
       "      <td>B00KCWMG5S</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>3</td>\n",
       "      <td>I should have waited until I owned the first p...</td>\n",
       "      <td>07 7, 2014</td>\n",
       "      <td>A3O26N290U3VI0</td>\n",
       "      <td>Khouri</td>\n",
       "      <td>so, this is weird</td>\n",
       "      <td>1404691200</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477153</th>\n",
       "      <td>B00KCWMG5S</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>1</td>\n",
       "      <td>Arrived with what looked like a bleach stain o...</td>\n",
       "      <td>06 23, 2014</td>\n",
       "      <td>A15WDJOU6B9FLQ</td>\n",
       "      <td>L. Atwood \"Bothell\"</td>\n",
       "      <td>Stained</td>\n",
       "      <td>1403481600</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477153</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477154</th>\n",
       "      <td>B00KCWMG5S</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>2</td>\n",
       "      <td>Trying to decide if return or just give away t...</td>\n",
       "      <td>06 5, 2014</td>\n",
       "      <td>AG5N21TGDQWRJ</td>\n",
       "      <td>Lori Mohler</td>\n",
       "      <td>just too small</td>\n",
       "      <td>1401926400</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477154</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477155</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>This is a (2) pack of balcalavas that can be c...</td>\n",
       "      <td>06 27, 2014</td>\n",
       "      <td>A12DQZKRKTNF5E</td>\n",
       "      <td>Andrea Polk</td>\n",
       "      <td>Quality set with multiple configurations</td>\n",
       "      <td>1403827200</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477156</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>I really wish I had these a few months ago whe...</td>\n",
       "      <td>06 7, 2014</td>\n",
       "      <td>A25C2M3QF9G7OQ</td>\n",
       "      <td>Comdet</td>\n",
       "      <td>I&amp;#8217;m ready for another frigid blast (or a...</td>\n",
       "      <td>1402099200</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477157</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[2, 3]</td>\n",
       "      <td>5</td>\n",
       "      <td>If you are an outdoor person and are outdoors ...</td>\n",
       "      <td>06 4, 2014</td>\n",
       "      <td>ABDR6IJ93HFIO</td>\n",
       "      <td>Daisy \"Daisy S\"</td>\n",
       "      <td>Wonderful for one who is outdoors in cold weat...</td>\n",
       "      <td>1401840000</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>477157</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477158</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[4, 5]</td>\n",
       "      <td>5</td>\n",
       "      <td>l  know now just what I am going as for Hallow...</td>\n",
       "      <td>06 16, 2014</td>\n",
       "      <td>A3BFDEBT5IV4UN</td>\n",
       "      <td>Dianne E. Socci-Tetro \"Never Judge a Book by ...</td>\n",
       "      <td>Look Mom I'm a Ninja...No, I'm a Motorcycle  M...</td>\n",
       "      <td>1402876800</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>477158</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477159</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[4, 5]</td>\n",
       "      <td>4</td>\n",
       "      <td>I go walking a lot in all kinds of weather and...</td>\n",
       "      <td>06 16, 2014</td>\n",
       "      <td>A1EVV74UQYVKRY</td>\n",
       "      <td>K. Groh</td>\n",
       "      <td>Great for Winter or Chilly Walks</td>\n",
       "      <td>1402876800</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>477159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477160</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[4, 7]</td>\n",
       "      <td>5</td>\n",
       "      <td>This two pack of Balaclavas makes for a very n...</td>\n",
       "      <td>06 9, 2014</td>\n",
       "      <td>ABUE0ALHKWKHC</td>\n",
       "      <td>Kiwi</td>\n",
       "      <td>Nice soft protection from the elements.....</td>\n",
       "      <td>1402272000</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>0.571429</td>\n",
       "      <td>40-60%</td>\n",
       "      <td>477160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477161</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[5, 6]</td>\n",
       "      <td>5</td>\n",
       "      <td>Well, the first thing I did was try the balacl...</td>\n",
       "      <td>06 13, 2014</td>\n",
       "      <td>A1PI8VBCXXSGC7</td>\n",
       "      <td>Lynn</td>\n",
       "      <td>Love that my ears have two layers of protectio...</td>\n",
       "      <td>1402617600</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477162</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[2, 3]</td>\n",
       "      <td>5</td>\n",
       "      <td>While balaclavas can be used for a variety of ...</td>\n",
       "      <td>06 13, 2014</td>\n",
       "      <td>A2XX2A4OJCDNLZ</td>\n",
       "      <td>RatherLiveInKeyWest</td>\n",
       "      <td>Balaclava 2 Pack - Black - Tan - 100% Polyeste...</td>\n",
       "      <td>1402617600</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>477162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477163</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[7, 8]</td>\n",
       "      <td>5</td>\n",
       "      <td>This is truly a year round product. Here in th...</td>\n",
       "      <td>06 21, 2014</td>\n",
       "      <td>A2YKWYC3WQJX5J</td>\n",
       "      <td>Shannon Lastowski \"Queen of Caffeine\"</td>\n",
       "      <td>Fits under even a tight helmet</td>\n",
       "      <td>1403308800</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>0.875000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477164</th>\n",
       "      <td>B00KF9180W</td>\n",
       "      <td>[2, 3]</td>\n",
       "      <td>4</td>\n",
       "      <td>Nice material, but not as nice as  silk or mer...</td>\n",
       "      <td>06 9, 2014</td>\n",
       "      <td>A3UJRNI8UR4871</td>\n",
       "      <td>Wulfstan \"wulfstan\"</td>\n",
       "      <td>Lightweight &amp; useful</td>\n",
       "      <td>1402272000</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>60-80%</td>\n",
       "      <td>477164</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477165</th>\n",
       "      <td>B00KGCLROK</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>2</td>\n",
       "      <td>These were a free sample for review.  I was ex...</td>\n",
       "      <td>06 21, 2014</td>\n",
       "      <td>A34BZM6S9L7QI4</td>\n",
       "      <td>Candy Cane \"Is it just me?\"</td>\n",
       "      <td>Wanted to love these</td>\n",
       "      <td>1403308800</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477166</th>\n",
       "      <td>B00KGCLROK</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>My stepmother does yoga in bare feet or regula...</td>\n",
       "      <td>07 3, 2014</td>\n",
       "      <td>A4WEZJOIZIV4U</td>\n",
       "      <td>Chuck Bittner \"Disabled comedian &amp; gamer!\"</td>\n",
       "      <td>My stepmother was impressed with the extra grip.</td>\n",
       "      <td>1404345600</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477167</th>\n",
       "      <td>B00KGCLROK</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>These socks are very nicely made and quite com...</td>\n",
       "      <td>06 22, 2014</td>\n",
       "      <td>A25C2M3QF9G7OQ</td>\n",
       "      <td>Comdet</td>\n",
       "      <td>A bit fussy to get on, but they work very well</td>\n",
       "      <td>1403395200</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477168</th>\n",
       "      <td>B00KGCLROK</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>You don&amp;#8217;t have to be a yoga or martial a...</td>\n",
       "      <td>07 5, 2014</td>\n",
       "      <td>ACJT8MUC0LRF0</td>\n",
       "      <td>D. Fowler</td>\n",
       "      <td>Very nice, comfortable non-slip socks for yoga...</td>\n",
       "      <td>1404518400</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477168</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477169</th>\n",
       "      <td>B00KGCLROK</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>These are cozy and complements well for yoga. ...</td>\n",
       "      <td>06 24, 2014</td>\n",
       "      <td>A2NOW4U7W3F7RI</td>\n",
       "      <td>rpv</td>\n",
       "      <td>Cozy!</td>\n",
       "      <td>1403568000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477170</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>I really hate my husband's packing system. He ...</td>\n",
       "      <td>06 9, 2014</td>\n",
       "      <td>A1W415JP5WEAJK</td>\n",
       "      <td>Alex S</td>\n",
       "      <td>Even Husbands can do it</td>\n",
       "      <td>1402272000</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477170</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477171</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>*Disclosure: I was contacted by a rep for Shac...</td>\n",
       "      <td>07 18, 2014</td>\n",
       "      <td>AX05DBU8IRUWY</td>\n",
       "      <td>C. Schmidt</td>\n",
       "      <td>Not for squares</td>\n",
       "      <td>1405641600</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477172</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[2, 2]</td>\n",
       "      <td>5</td>\n",
       "      <td>This set of travel organizers includes four pi...</td>\n",
       "      <td>06 13, 2014</td>\n",
       "      <td>AEL6CQNQXONBX</td>\n",
       "      <td>Cute Chihuahua</td>\n",
       "      <td>Can be used for organization but they are grea...</td>\n",
       "      <td>1402617600</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477173</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>When I pack it looks like a disaster area in a...</td>\n",
       "      <td>06 9, 2014</td>\n",
       "      <td>ACJT8MUC0LRF0</td>\n",
       "      <td>D. Fowler</td>\n",
       "      <td>End of my packing nightmare system ...</td>\n",
       "      <td>1402272000</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477173</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477174</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>I don't normally go ga-ga over a product very ...</td>\n",
       "      <td>06 24, 2014</td>\n",
       "      <td>A2DG63DN704LOI</td>\n",
       "      <td>ESlayd</td>\n",
       "      <td>These have literally changed the way I travel!</td>\n",
       "      <td>1403568000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477175</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[0, 0]</td>\n",
       "      <td>5</td>\n",
       "      <td>I've been traveling back and forth to England ...</td>\n",
       "      <td>06 26, 2014</td>\n",
       "      <td>A1EVV74UQYVKRY</td>\n",
       "      <td>K. Groh</td>\n",
       "      <td>Wonderful for Better Packing</td>\n",
       "      <td>1403740800</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477176</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[1, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>These are very nice packing cubes and the 18 x...</td>\n",
       "      <td>06 8, 2014</td>\n",
       "      <td>A1UQBFCERIP7VJ</td>\n",
       "      <td>Margaret Picky</td>\n",
       "      <td>Convenient, lightweight, and durable</td>\n",
       "      <td>1402185600</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477176</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477177</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[2, 2]</td>\n",
       "      <td>5</td>\n",
       "      <td>I am on vacation with my family of four and th...</td>\n",
       "      <td>07 7, 2014</td>\n",
       "      <td>A22CW0ZHY3NJH8</td>\n",
       "      <td>Noname</td>\n",
       "      <td>Holds Up Well In Real World Test</td>\n",
       "      <td>1404691200</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>80-100%</td>\n",
       "      <td>477177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477178</th>\n",
       "      <td>B00KKXCJQU</td>\n",
       "      <td>[0, 1]</td>\n",
       "      <td>5</td>\n",
       "      <td>When I signed up to receive a free set of Shac...</td>\n",
       "      <td>06 23, 2014</td>\n",
       "      <td>A30VWT3R25QAVD</td>\n",
       "      <td>THE-DEADLY-DOG \"Living and Loving Life.\"</td>\n",
       "      <td>Don't Travel? Still Way too Useful for 'Averag...</td>\n",
       "      <td>1403481600</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>Empty</td>\n",
       "      <td>477178</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>477135 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              asin   helpful  overall  \\\n",
       "0       7806397051    [3, 4]        1   \n",
       "1       7806397051    [1, 1]        3   \n",
       "2       7806397051    [0, 1]        4   \n",
       "3       7806397051    [2, 2]        2   \n",
       "4       7806397051    [0, 0]        3   \n",
       "5       7806397051    [1, 2]        5   \n",
       "6       7806397051    [1, 3]        1   \n",
       "7       7806397051    [0, 1]        2   \n",
       "8       9759091062    [0, 0]        2   \n",
       "9       9759091062    [0, 0]        3   \n",
       "10      9759091062    [0, 0]        3   \n",
       "11      9759091062    [0, 0]        1   \n",
       "12      9759091062    [0, 1]        5   \n",
       "13      9759091062    [0, 0]        1   \n",
       "14      9759091062    [0, 1]        5   \n",
       "15      9759091062    [0, 0]        2   \n",
       "16      9759091062    [2, 4]        5   \n",
       "17      9759091062    [2, 4]        4   \n",
       "18      9759091062    [0, 1]        3   \n",
       "19      9788072216  [24, 24]        5   \n",
       "20      9788072216    [0, 0]        5   \n",
       "21      9788072216    [1, 1]        5   \n",
       "22      9788072216    [2, 4]        5   \n",
       "23      9788072216    [0, 0]        5   \n",
       "24      9790790961    [1, 1]        5   \n",
       "25      9790790961    [0, 1]        3   \n",
       "26      9790790961    [0, 0]        5   \n",
       "27      9790790961    [0, 1]        5   \n",
       "28      9790790961    [1, 2]        5   \n",
       "29      9790790961    [0, 0]        3   \n",
       "...            ...       ...      ...   \n",
       "477149  B00KA602SY    [0, 0]        5   \n",
       "477150  B00KCWMG5S    [0, 0]        2   \n",
       "477151  B00KCWMG5S    [2, 2]        4   \n",
       "477152  B00KCWMG5S    [0, 0]        3   \n",
       "477153  B00KCWMG5S    [1, 1]        1   \n",
       "477154  B00KCWMG5S    [0, 0]        2   \n",
       "477155  B00KF9180W    [1, 1]        5   \n",
       "477156  B00KF9180W    [1, 1]        5   \n",
       "477157  B00KF9180W    [2, 3]        5   \n",
       "477158  B00KF9180W    [4, 5]        5   \n",
       "477159  B00KF9180W    [4, 5]        4   \n",
       "477160  B00KF9180W    [4, 7]        5   \n",
       "477161  B00KF9180W    [5, 6]        5   \n",
       "477162  B00KF9180W    [2, 3]        5   \n",
       "477163  B00KF9180W    [7, 8]        5   \n",
       "477164  B00KF9180W    [2, 3]        4   \n",
       "477165  B00KGCLROK    [1, 1]        2   \n",
       "477166  B00KGCLROK    [0, 0]        5   \n",
       "477167  B00KGCLROK    [0, 0]        5   \n",
       "477168  B00KGCLROK    [1, 1]        5   \n",
       "477169  B00KGCLROK    [0, 0]        5   \n",
       "477170  B00KKXCJQU    [1, 1]        5   \n",
       "477171  B00KKXCJQU    [0, 0]        5   \n",
       "477172  B00KKXCJQU    [2, 2]        5   \n",
       "477173  B00KKXCJQU    [1, 1]        5   \n",
       "477174  B00KKXCJQU    [0, 1]        5   \n",
       "477175  B00KKXCJQU    [0, 0]        5   \n",
       "477176  B00KKXCJQU    [1, 1]        5   \n",
       "477177  B00KKXCJQU    [2, 2]        5   \n",
       "477178  B00KKXCJQU    [0, 1]        5   \n",
       "\n",
       "                                               reviewText   reviewTime  \\\n",
       "0       Very oily and creamy. Not at all what I expect...  01 30, 2014   \n",
       "1       This palette was a decent price and I was look...  04 18, 2014   \n",
       "2       The texture of this concealer pallet is fantas...   09 6, 2013   \n",
       "3       I really can't tell what exactly this thing is...   12 8, 2013   \n",
       "4       It was a little smaller than I expected, but t...  10 19, 2013   \n",
       "5       I was very happy to get this palette, now I wi...  04 15, 2013   \n",
       "6       PLEASE DONT DO IT! this just rachett the palet...  08 16, 2013   \n",
       "7       Chalky,Not Pigmented,Wears off easily,Not a Co...   09 4, 2013   \n",
       "8       Did nothing for me. Stings when I put it on. I...  07 13, 2014   \n",
       "9       I bought this product to get rid of the dark s...  12 27, 2013   \n",
       "10      I have mixed feelings about this product. When...  05 20, 2014   \n",
       "11      Did nothing for my skin. Used as suggested and...  02 18, 2014   \n",
       "12      I bought this product about 3 months ago, I fi...  01 23, 2014   \n",
       "13      This gell did nothing at all. I religiously pu...  01 11, 2014   \n",
       "14      i got this to get rid of a scar and it did jus...  02 18, 2014   \n",
       "15      I used it for anal bleaching and it burned a b...   04 6, 2014   \n",
       "16      I order this cream along with their soap. It a...  09 14, 2013   \n",
       "17      Good product. Use a little bit on your spot an...  10 18, 2013   \n",
       "18      I didn't use it past a week. The reason why is...   11 1, 2013   \n",
       "19      I haven't been a big fan of Prada's fragrances...  09 19, 2011   \n",
       "20      We gave these as gifts and everyone that recei...  08 10, 2013   \n",
       "21      This is the first fragrance by Prada that I lo...  11 28, 2011   \n",
       "22      So I got this about a month ago. I had no plan...  05 27, 2012   \n",
       "23      This product has a very fruity scent which is ...   02 2, 2013   \n",
       "24      I'm very picky when it comes to fragrance. I l...  03 11, 2014   \n",
       "25      bright crystals reminds me of Victoria Secrets...  12 19, 2011   \n",
       "26      Got this product and I never heard of this so ...   09 8, 2013   \n",
       "27      This is a beautiful perfume! Nice, clean scent...   02 2, 2014   \n",
       "28      This is the real Versace Bright Crystal fragra...  02 14, 2014   \n",
       "29      I love it! and will continue using it but it's...  02 12, 2014   \n",
       "...                                                   ...          ...   \n",
       "477149  I really like this shirt, very comfortable and...  06 22, 2014   \n",
       "477150                                For tiny teenagers.  07 20, 2014   \n",
       "477151  Like these pants, 1st time I wore them I rippe...   06 6, 2014   \n",
       "477152  I should have waited until I owned the first p...   07 7, 2014   \n",
       "477153  Arrived with what looked like a bleach stain o...  06 23, 2014   \n",
       "477154  Trying to decide if return or just give away t...   06 5, 2014   \n",
       "477155  This is a (2) pack of balcalavas that can be c...  06 27, 2014   \n",
       "477156  I really wish I had these a few months ago whe...   06 7, 2014   \n",
       "477157  If you are an outdoor person and are outdoors ...   06 4, 2014   \n",
       "477158  l  know now just what I am going as for Hallow...  06 16, 2014   \n",
       "477159  I go walking a lot in all kinds of weather and...  06 16, 2014   \n",
       "477160  This two pack of Balaclavas makes for a very n...   06 9, 2014   \n",
       "477161  Well, the first thing I did was try the balacl...  06 13, 2014   \n",
       "477162  While balaclavas can be used for a variety of ...  06 13, 2014   \n",
       "477163  This is truly a year round product. Here in th...  06 21, 2014   \n",
       "477164  Nice material, but not as nice as  silk or mer...   06 9, 2014   \n",
       "477165  These were a free sample for review.  I was ex...  06 21, 2014   \n",
       "477166  My stepmother does yoga in bare feet or regula...   07 3, 2014   \n",
       "477167  These socks are very nicely made and quite com...  06 22, 2014   \n",
       "477168  You don&#8217;t have to be a yoga or martial a...   07 5, 2014   \n",
       "477169  These are cozy and complements well for yoga. ...  06 24, 2014   \n",
       "477170  I really hate my husband's packing system. He ...   06 9, 2014   \n",
       "477171  *Disclosure: I was contacted by a rep for Shac...  07 18, 2014   \n",
       "477172  This set of travel organizers includes four pi...  06 13, 2014   \n",
       "477173  When I pack it looks like a disaster area in a...   06 9, 2014   \n",
       "477174  I don't normally go ga-ga over a product very ...  06 24, 2014   \n",
       "477175  I've been traveling back and forth to England ...  06 26, 2014   \n",
       "477176  These are very nice packing cubes and the 18 x...   06 8, 2014   \n",
       "477177  I am on vacation with my family of four and th...   07 7, 2014   \n",
       "477178  When I signed up to receive a free set of Shac...  06 23, 2014   \n",
       "\n",
       "            reviewerID                                      reviewerName  \\\n",
       "0       A1YJEY40YUW4SE                                            Andrea   \n",
       "1        A60XNB876KYML                                        Jessica H.   \n",
       "2       A3G6XNM240RMWA                                             Karen   \n",
       "3       A1PQFP6SAJ6D80                                             Norah   \n",
       "4       A38FVHZTNQ271F                                         Nova Amor   \n",
       "5       A3BTN14HIZET6Z                    S. M. Randall \"WildHorseWoman\"   \n",
       "6       A1Z59RFKN0M5QL                                 tasha \"luvely12b\"   \n",
       "7        AWUO9P6PL1SY8                                     TreMagnifique   \n",
       "8       A3LMILRM9OC3SA                                               NaN   \n",
       "9       A30IP88QK3YUIO                               Amina Bint Ibraheem   \n",
       "10       APBQH4BS48CQO                                           Charmmy   \n",
       "11      A3FE8W8UV95U6B                                 Culture C Simmons   \n",
       "12      A1EVGDOTGFZOSS                           Jessica \"Anarchykisses\"   \n",
       "13       AP5WTCMP6DTRV                                           Layla B   \n",
       "14      A21IM16PQWKVO5                                          mdub9922   \n",
       "15      A1TLDR1V4O48PK                     Mickey O Neil \"Mickey O Neil\"   \n",
       "16       A6F8KH0J1AVYA                                            SanBen   \n",
       "17       AXPKZA7UZXKTT                                         Shirleyyy   \n",
       "18      A2SIAYDK7GG7QA                                      theredtranny   \n",
       "19      A1QV5IH6HDRN0L                                          armygirl   \n",
       "20      A3UQXHI88S7XAX                                         D. Greene   \n",
       "21      A2EK2CJNJUF7OQ                                             Nikki   \n",
       "22      A2GWNGQF9SHRE4                             Pholuke \"Lepa Shandy\"   \n",
       "23       ABV67T136UXFQ                                            Sandra   \n",
       "24      A2FQZKL2KIZACO                                          Ellie B.   \n",
       "25      A312RDWQYLAG7S                                               ltg   \n",
       "26      A3TYR1ALBZ2EU9                                       Mananagirl6   \n",
       "27       AUYVMLI0CBMYS                                          Shay1234   \n",
       "28      A2H0VDRANZMGGX                                         Shoe luva   \n",
       "29      A2MZDI3I5AEL74                            Y. Siani \"I love nini\"   \n",
       "...                ...                                               ...   \n",
       "477149   ANNHM5C3DX72Q                                    Tracey Simmons   \n",
       "477150  A2FENE35P9Z592                                            Amanda   \n",
       "477151    AODACROYFBAY                                   Denise M Nelson   \n",
       "477152  A3O26N290U3VI0                                            Khouri   \n",
       "477153  A15WDJOU6B9FLQ                               L. Atwood \"Bothell\"   \n",
       "477154   AG5N21TGDQWRJ                                       Lori Mohler   \n",
       "477155  A12DQZKRKTNF5E                                       Andrea Polk   \n",
       "477156  A25C2M3QF9G7OQ                                            Comdet   \n",
       "477157   ABDR6IJ93HFIO                                   Daisy \"Daisy S\"   \n",
       "477158  A3BFDEBT5IV4UN  Dianne E. Socci-Tetro \"Never Judge a Book by ...   \n",
       "477159  A1EVV74UQYVKRY                                           K. Groh   \n",
       "477160   ABUE0ALHKWKHC                                              Kiwi   \n",
       "477161  A1PI8VBCXXSGC7                                              Lynn   \n",
       "477162  A2XX2A4OJCDNLZ                               RatherLiveInKeyWest   \n",
       "477163  A2YKWYC3WQJX5J             Shannon Lastowski \"Queen of Caffeine\"   \n",
       "477164  A3UJRNI8UR4871                               Wulfstan \"wulfstan\"   \n",
       "477165  A34BZM6S9L7QI4                       Candy Cane \"Is it just me?\"   \n",
       "477166   A4WEZJOIZIV4U        Chuck Bittner \"Disabled comedian & gamer!\"   \n",
       "477167  A25C2M3QF9G7OQ                                            Comdet   \n",
       "477168   ACJT8MUC0LRF0                                         D. Fowler   \n",
       "477169  A2NOW4U7W3F7RI                                               rpv   \n",
       "477170  A1W415JP5WEAJK                                            Alex S   \n",
       "477171   AX05DBU8IRUWY                                        C. Schmidt   \n",
       "477172   AEL6CQNQXONBX                                    Cute Chihuahua   \n",
       "477173   ACJT8MUC0LRF0                                         D. Fowler   \n",
       "477174  A2DG63DN704LOI                                            ESlayd   \n",
       "477175  A1EVV74UQYVKRY                                           K. Groh   \n",
       "477176  A1UQBFCERIP7VJ                                    Margaret Picky   \n",
       "477177  A22CW0ZHY3NJH8                                            Noname   \n",
       "477178  A30VWT3R25QAVD          THE-DEADLY-DOG \"Living and Loving Life.\"   \n",
       "\n",
       "                                                  summary  unixReviewTime  \\\n",
       "0                                  Don't waste your money      1391040000   \n",
       "1                                             OK Palette!      1397779200   \n",
       "2                                           great quality      1378425600   \n",
       "3                                  Do not work on my face      1386460800   \n",
       "4                                              It's okay.      1382140800   \n",
       "5                                      Very nice palette!      1365984000   \n",
       "6                                                  smh!!!      1376611200   \n",
       "7       Chalky, Not Pigmented, Wears off easily, Not a...      1378252800   \n",
       "8             no Lightening, no Brightening,......NOTHING      1405209600   \n",
       "9                                             Its alright      1388102400   \n",
       "10                                        Mixed feelings.      1400544000   \n",
       "11                                                Nothing      1392681600   \n",
       "12                                             This works      1390435200   \n",
       "13                                           Does nothing      1389398400   \n",
       "14                                               it works      1392681600   \n",
       "15                                                  burns      1396742400   \n",
       "16                                        Did work for me      1379116800   \n",
       "17                                              excellent      1382054400   \n",
       "18                                            weird smell      1383264000   \n",
       "19                                Love the smell of this!      1316390400   \n",
       "20                                                  Happy      1376092800   \n",
       "21                                              Very good      1322438400   \n",
       "22                                       Lurrrrrrrrv.....      1338076800   \n",
       "23                                            Great Scent      1359763200   \n",
       "24                              Spring Garden in a Bottle      1394496000   \n",
       "25                                            fresh smell      1324252800   \n",
       "26                                          My new smell!      1378598400   \n",
       "27                                        One of my favs!      1391299200   \n",
       "28                                           Smells clean      1392336000   \n",
       "29       Love the smell but a shame it's not last as long      1392163200   \n",
       "...                                                   ...             ...   \n",
       "477149                                          Very nice      1403395200   \n",
       "477150                                        Teeny pants      1405814400   \n",
       "477151                                     fabric is thin      1402012800   \n",
       "477152                                  so, this is weird      1404691200   \n",
       "477153                                            Stained      1403481600   \n",
       "477154                                     just too small      1401926400   \n",
       "477155           Quality set with multiple configurations      1403827200   \n",
       "477156  I&#8217;m ready for another frigid blast (or a...      1402099200   \n",
       "477157  Wonderful for one who is outdoors in cold weat...      1401840000   \n",
       "477158  Look Mom I'm a Ninja...No, I'm a Motorcycle  M...      1402876800   \n",
       "477159                   Great for Winter or Chilly Walks      1402876800   \n",
       "477160        Nice soft protection from the elements.....      1402272000   \n",
       "477161  Love that my ears have two layers of protectio...      1402617600   \n",
       "477162  Balaclava 2 Pack - Black - Tan - 100% Polyeste...      1402617600   \n",
       "477163                     Fits under even a tight helmet      1403308800   \n",
       "477164                               Lightweight & useful      1402272000   \n",
       "477165                               Wanted to love these      1403308800   \n",
       "477166   My stepmother was impressed with the extra grip.      1404345600   \n",
       "477167     A bit fussy to get on, but they work very well      1403395200   \n",
       "477168  Very nice, comfortable non-slip socks for yoga...      1404518400   \n",
       "477169                                              Cozy!      1403568000   \n",
       "477170                            Even Husbands can do it      1402272000   \n",
       "477171                                    Not for squares      1405641600   \n",
       "477172  Can be used for organization but they are grea...      1402617600   \n",
       "477173             End of my packing nightmare system ...      1402272000   \n",
       "477174     These have literally changed the way I travel!      1403568000   \n",
       "477175                       Wonderful for Better Packing      1403740800   \n",
       "477176               Convenient, lightweight, and durable      1402185600   \n",
       "477177                   Holds Up Well In Real World Test      1404691200   \n",
       "477178  Don't Travel? Still Way too Useful for 'Averag...      1403481600   \n",
       "\n",
       "        HelpfulnessNumerator  HelpfulnessDenominator  Helpful % % Upvote  \\\n",
       "0                          3                       4   0.750000   60-80%   \n",
       "1                          1                       1   1.000000  80-100%   \n",
       "2                          0                       1   0.000000    Empty   \n",
       "3                          2                       2   1.000000  80-100%   \n",
       "4                          0                       0  -1.000000    Empty   \n",
       "5                          1                       2   0.500000   40-60%   \n",
       "6                          1                       3   0.333333   20-40%   \n",
       "7                          0                       1   0.000000    Empty   \n",
       "8                          0                       0  -1.000000    Empty   \n",
       "9                          0                       0  -1.000000    Empty   \n",
       "10                         0                       0  -1.000000    Empty   \n",
       "11                         0                       0  -1.000000    Empty   \n",
       "12                         0                       1   0.000000    Empty   \n",
       "13                         0                       0  -1.000000    Empty   \n",
       "14                         0                       1   0.000000    Empty   \n",
       "15                         0                       0  -1.000000    Empty   \n",
       "16                         2                       4   0.500000   40-60%   \n",
       "17                         2                       4   0.500000   40-60%   \n",
       "18                         0                       1   0.000000    Empty   \n",
       "19                        24                      24   1.000000  80-100%   \n",
       "20                         0                       0  -1.000000    Empty   \n",
       "21                         1                       1   1.000000  80-100%   \n",
       "22                         2                       4   0.500000   40-60%   \n",
       "23                         0                       0  -1.000000    Empty   \n",
       "24                         1                       1   1.000000  80-100%   \n",
       "25                         0                       1   0.000000    Empty   \n",
       "26                         0                       0  -1.000000    Empty   \n",
       "27                         0                       1   0.000000    Empty   \n",
       "28                         1                       2   0.500000   40-60%   \n",
       "29                         0                       0  -1.000000    Empty   \n",
       "...                      ...                     ...        ...      ...   \n",
       "477149                     0                       0  -1.000000    Empty   \n",
       "477150                     0                       0  -1.000000    Empty   \n",
       "477151                     2                       2   1.000000  80-100%   \n",
       "477152                     0                       0  -1.000000    Empty   \n",
       "477153                     1                       1   1.000000  80-100%   \n",
       "477154                     0                       0  -1.000000    Empty   \n",
       "477155                     1                       1   1.000000  80-100%   \n",
       "477156                     1                       1   1.000000  80-100%   \n",
       "477157                     2                       3   0.666667   60-80%   \n",
       "477158                     4                       5   0.800000   60-80%   \n",
       "477159                     4                       5   0.800000   60-80%   \n",
       "477160                     4                       7   0.571429   40-60%   \n",
       "477161                     5                       6   0.833333  80-100%   \n",
       "477162                     2                       3   0.666667   60-80%   \n",
       "477163                     7                       8   0.875000  80-100%   \n",
       "477164                     2                       3   0.666667   60-80%   \n",
       "477165                     1                       1   1.000000  80-100%   \n",
       "477166                     0                       0  -1.000000    Empty   \n",
       "477167                     0                       0  -1.000000    Empty   \n",
       "477168                     1                       1   1.000000  80-100%   \n",
       "477169                     0                       0  -1.000000    Empty   \n",
       "477170                     1                       1   1.000000  80-100%   \n",
       "477171                     0                       0  -1.000000    Empty   \n",
       "477172                     2                       2   1.000000  80-100%   \n",
       "477173                     1                       1   1.000000  80-100%   \n",
       "477174                     0                       1   0.000000    Empty   \n",
       "477175                     0                       0  -1.000000    Empty   \n",
       "477176                     1                       1   1.000000  80-100%   \n",
       "477177                     2                       2   1.000000  80-100%   \n",
       "477178                     0                       1   0.000000    Empty   \n",
       "\n",
       "            Id  \n",
       "0            0  \n",
       "1            1  \n",
       "2            2  \n",
       "3            3  \n",
       "4            4  \n",
       "5            5  \n",
       "6            6  \n",
       "7            7  \n",
       "8            8  \n",
       "9            9  \n",
       "10          10  \n",
       "11          11  \n",
       "12          12  \n",
       "13          13  \n",
       "14          14  \n",
       "15          15  \n",
       "16          16  \n",
       "17          17  \n",
       "18          18  \n",
       "19          19  \n",
       "20          20  \n",
       "21          21  \n",
       "22          22  \n",
       "23          23  \n",
       "24          24  \n",
       "25          25  \n",
       "26          26  \n",
       "27          27  \n",
       "28          28  \n",
       "29          29  \n",
       "...        ...  \n",
       "477149  477149  \n",
       "477150  477150  \n",
       "477151  477151  \n",
       "477152  477152  \n",
       "477153  477153  \n",
       "477154  477154  \n",
       "477155  477155  \n",
       "477156  477156  \n",
       "477157  477157  \n",
       "477158  477158  \n",
       "477159  477159  \n",
       "477160  477160  \n",
       "477161  477161  \n",
       "477162  477162  \n",
       "477163  477163  \n",
       "477164  477164  \n",
       "477165  477165  \n",
       "477166  477166  \n",
       "477167  477167  \n",
       "477168  477168  \n",
       "477169  477169  \n",
       "477170  477170  \n",
       "477171  477171  \n",
       "477172  477172  \n",
       "477173  477173  \n",
       "477174  477174  \n",
       "477175  477175  \n",
       "477176  477176  \n",
       "477177  477177  \n",
       "477178  477178  \n",
       "\n",
       "[477135 rows x 14 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Cleaning the data by eliminating duplicates\n",
    "reviews.drop_duplicates(subset=['reviewerID', 'asin','unixReviewTime'],inplace=True)\n",
    "\n",
    "#Adding the helpfulness and upvote percentages for metrics\n",
    "reviews['Helpful %'] = np.where(reviews['HelpfulnessDenominator'] > 0, reviews['HelpfulnessNumerator'] / reviews['HelpfulnessDenominator'], -1)\n",
    "reviews['% Upvote'] = pd.cut(reviews['Helpful %'], bins = [-1, 0, 0.2, 0.4, 0.6, 0.8, 1.0], labels = ['Empty', '0-20%', '20-40%', '40-60%', '60-80%', '80-100%'], include_lowest = True)\n",
    "reviews['Id'] = reviews.index;\n",
    "reviews"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n8a7bLL9GRUTOVnbkrQkiImc/MxuMt/lHx0i3RcLPvJ1KlwE5/A00REREopoibSIictYzsxvMLLt5\nf/dtGDBVEzYRETlTaNImIiL/BHfgLSv8Be8+qrsi2xwREZHQaXmkiIiIiIhIFFOkTUREREREJIrF\nRLoBZwiFI0VEREQkq53q37IMq1ylbw7bd+MDv793RoxJVtOkLQQpbmmkmyBRJmgXk5z6Y6SbIVEm\nJlCNQykLI90MiTI5gnVISJwZ6WZIlCmQvSmvr9Z1IX+5tWLTSDdBopiWR4qIiIiIiEQxRdpERERE\nRCRkZor7hJtGXEREREREJIop0iYiIiIiIiEzxX3CTiMuIiIiIiISxRRpExERERGRkOmetvDTiIuI\niIiIiEQxRdpERERERCRkirSFn0ZcREREREQkiinSJiIiIiIiITOzSDfhH0eRNhERERERkSimSJuI\niIiIiJwExX3CTSMuIiIiIiISxTRpExERERERiWJaHikiIiIiIiHTlv/hpxEXERERERGJYoq0iYiI\niIhIyBRpCz+NuIiIiIiISBRTpE1EREREREJmivuEnUZcREREREQkiinSJiIiIiIiIdM9beGnERcR\nEREREYliirSJiIiIiEjIFGkLP424iIiIiIhIFFOkTUREREREQqZIW/hpxEVERERERKKYIm0iIiIi\nIhIywyLdhH8cRdpERERERESimCJtIiIiIiISMt3TFn4acRERERERkSimSZuIiIiIiEgU0/JIERER\nEREJmZZHhp9GXEREREREJIop0iYiIiIiIiFTpC38NOIiIiIiIiJRTJE2ERERERE5CYr7hJtGXERE\nREREJIop0iYiIiIiIiHTPW3hpxEXERERERGJYoq0CSkpKbRr259icbG88NKDOOcY/fR7zPx0AcFg\ngJvaN+E/na5l4bfLufeeYZQoGQfA1Vdfwt33tMu0HjmzXd3oHvLkyUkgGCAmGGTCxCfSjr3+2hSe\nHPE2//v6VQoVyg/AwoXLeeLxN0hOSqFQoXyMe+sRAMa98QmTJs7FzKhQsRRDht5NjhzZI9InOXkP\nDXyF+fOXEBubn4+meNdAwu699Ok9hj827aB4iSI8+dR95C+Qh3lzvmPMs5MImBGMCdK3fwdq1Lwg\nra69ew/Q6rp+NGxckwGDOgNwW+chbN++m5z+NfHiq30pXLhA+DsqIdu6JZ7BA95i544/sYBxQ9t6\n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\nRERERERCpt0jw08jLiIiIiIiEsUUaRMRERERkZCZWaSb8I+jSJuIiIiIiEgU06RNREREREQkiml5\npIiIiIiIhEx/XDv8NOIiIiIiIiJRTJE2EREREREJmbb8Dz+NuIiIiIiISBRTpE1EREREREKnLf/D\nTpE2ERERERGRKKZIm4iIiIiIhE5hn7DTkIuIiIiIiEQxRdpERERERCR0uqct7BRpExERERERiWKK\ntImIiIiISOgUaQs7RdpERERERESimCJtIiIiIiISOoV9wk5DLiIiIiIiEsUUaRMRERERkZA53dMW\ndoq0iYiIiIiIRDFN2kRERERERKKYlkeKiIiIiEjotDoy7BRpExERERERiWKKtImIiIiISOgCCrWF\nmyJtIiIiIiIiUUyRNhERERERCZ22/A87RdpERERERESimDnnIt2GM4EGSURERESy2hkRwqrQ8JWw\nfTdeM7frGTEmWU2RNhERERERkSime9pC4FgZ6SZIlDEq67qQYxiVSXUrIt0MiTIBq0KqWx7pZkiU\nCVhVDqUsjHQzJIrkCNaJdBNCp90jw06RNhERERERkSimSZuIiIiIiITOLHyPEzbFXjOzbWa27Kj0\n+8xslZktN7Ph6dIfNLO1/rGm6dKb+Wlrzax/uvSyZvatma0xs/fNLLufnsN/vdY/XuY0jGymNGkT\nEREREZEz1RtAs/QJZtYAaAlc7JyrCjzpp1cB2gNV/TLPm1nQzILAc8A1QBXgZj8vwDBglHOuAhAP\ndPHTuwDxzrnzgVF+viyjSZuIiIiIiITOwvg4AefcF8Cuo5LvAp5wzh3y82zz01sC451zh5xz64G1\nQB3/sdY5t845lwiMB1qamQENgYl++XFAq3R1jfOfTwQa+fmzhCZtIiIiIiISlcysm5ktTvfoFkKx\nisAV/rLF+WZW208vAWxIl2+jn5ZZemFgt3Mu+aj0I+ryjyf4+bOEdo8UEREREZHQhXH3SOfcy8DL\nJ1ksBigE1AVqAxPMrBwZx+4cGQey3HHyc4Jjp50ibSIiIiIicjbZCHzoPAuBVKCIn14qXb6SwB/H\nSd8BFDSzmKPSSV/GP16AY5dpnjaatImIiIiISOii6J62THyMdy8aZlYRyI43AZsCtPd3fiwLVAAW\nAouACv5OkdnxNiuZ4pxzwDygrV9vZ2Cy/3yK/xr/+Fw/f5bQ8kgRERERETkjmdl7QH2giJltBB4G\n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\nxZtwxQO3OefWmVlO4C3gX3gRtvbOuXV+mdzANKCJcy7JzK4AngcS8f4MwOrjtdex8h+/y6QcyaiM\nS/t9gYjHqEyqWxHpZkiUCVgVUt3ySDdDokzAqnIoZeGJM8o/Ro5gHThDFgSWv3VC2L4b//L6jWfE\nmGS1iPydNufcD0CtDA41CqHsR8AxdzQ75w4C7TIpsx9okO71l8BFobZXRERERER8irSFXaT+TpuI\niIiIiIiEICKRNhEREREROTM5BdrCTpE2ERERERGRKKZIm4iIiIiIhE73tIWdIm0iIiIiIiJRTJE2\nEREREREJnSnSFm6KtImIiIiIiEQxRdpERERERCR0uqct7BRpExERERERiWKKtImIiIiISOgU9gk7\nDbmIiIiIiEgU06RNREREREQkiml5pIiIiIiIhE5b/oedIm0iIiIiIiJRTJE2EREREREJnbb8DztF\n2kRERERERKKYIm0iIiIiIhIyp3vawk6RNhERERERkSimSJuIiIiIiIROYZ+w05CLiIiIiIhEMUXa\nREREREQkdNo9MuwUaRMREREREYliirSJiIiIiEjotHtk2CnSJiIiIiIiEsUUaRMRERERkdDpnraw\nU6RNREREREQkiinSJiIiIiIioVOgLewUaRMREREREYlimrSJiIiIiIhEMS2PFBERERGRkDltRBJ2\nirSJiIiIiIhEMUXaREREREQkdIq0hZ0ibSIiIiIiIlFMkTYREREREQmdKdIWboq0iYiIiIiIRDFF\n2kREREREJHQK+4SdhlxERERERCSKKdImIiIiIiKh0z1tYadIm4iIiIiISBRTpC0ERuVIN0GikK4L\nyUjAqkS6CRKFAlY10k2QKJQjWCfSTRA5Nfo7bWGnSVsIHCsj3QSJMkZlXRdyDKMyqW5FpJshUSZg\nVUhxyyLdDIkyQbuQQymLIt0MiSI5grUj3QSJYpq0iYiIiIhI6BRpCzvd0yYiIiIiIhLFFGkTERER\nEZGQOe0eGXaKtImIiIiIiEQxTdpERERERESimJZHioiIiIhI6BT2CTsNuYiIiIiISBRTpE1ERERE\nREKnjUjCTpE2ERERERGRKKZIm4iIiIiIhE5/XDvsFGkTERERERGJYoq0iYiIiIhI6BRpCztF2kRE\nRERERKKYIm0iIiIiIhI6BdrCTpE2ERERERGRKKZIm4iIiIiIhMzpnrawU6RNREREREQkiinSJiIi\n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\nfoyxECCEcAHwDomVKR+PMU5K1/mtYqdNkiRJ0kYrxrhqZfjiviUxV23NfX9vSlUPoEcJ5W+SmN+W\nMXbaJEmSJKXM+VXp52suSZIkSVnMpE2SJElSylJcIER/IZM2SZIkScpiJm2SJEmSUhZC2n5bW0km\nbZIkSZKUxUzaJEmSJKXMOW3pZ9ImSZIkSVnMpE2SJElSykx90s/XXJIkSZKymEmbJEmSpJTluHpk\n2pm0SZIkSVIWM2mTJEmSlDJXj0w/kzZJkiRJymImbZIkSZJSZtKWfiZtkiRJkpTF7LRJkiRJUhZz\neKQkSZKklOVmugGbIZM2SZIkScpiJm2SJEmSUuaPa6efSZskSZIkZTGTNkmSJEkpc8n/9DNpkyRJ\nkqQsZtImSZIkKWUmbeln0iZJkiRJWcykTZIkSVLKck3a0s6kTZIkSZKymEmbJEmSpJQ5py39TNok\nSZIkKYuZtEmSJElKWU6ImW7CZsekTZIkSZKymEmbJEmSpJQ5py39TNokSZIkKYvZaZMkSZKkLObw\nSEmSJEkpy810AzZDJm2SJEmSlMVM2lIQaJbpJigrNc10A5SVvC5UEq8L/ZafL7SxciGS9LPTlpLJ\nmW6Ask5TvC70W14XKonXhUridaE1+eWO1s5OmyRJkqSU+ePa6eecNkmSJEnKYiZtkiRJklKW65y2\ntDNpkyRJkqQsZtImSZIkKWWuHpl+Jm2SJEmSlMVM2iRJkiSlzKQt/UzaJEmSJCmLmbRJkiRJSplJ\nW/qZtEmSJElSFjNpkyRJkpSy3BAz3YTNjkmbJEmSJGUxO22SJEmSlMUcHilJkiQpZaY+6edrLkmS\nJElZzKRNkiRJUspc8j/9TNokSZIkKYuZtEmSJElKmUlb+pm0SZIkSVIWM2mTJEmSlDJ/XDv9TNok\nSZIkKYuZtEmSJElKmXPa0s+kTZIkSZKymEmbJEmSpJSZtKWfSZskSZIkZTGTNkmSJEkpM2lLP5M2\nSZIkScpiJm2SJEmSUpZr0pZ2Jm2SJEmSlMXstEmSJElSFnN4pCRJkqSU5YSY6SZsdkzaJEmSJCmL\nmbRJkiRJSpmpT/r5mkuSJElSFjNpkyRJkpQyf1w7/UzaJEmSJCmLmbRJkiRJSpk/rp1+Jm2SJEmS\nlMVM2iRJkiSlzN9pSz+TNkmSJEnKYiZtKrJiRR6nntqNvLx8CgsL6dBhX7p0ObXo8ZtvfoRXXnmf\nzz7rD8CsWXO58sp7+eWXpRQWruSyy85g//33yFTztYFcddV9DB06hurVq/DGG70BuP32x/nww08o\nXbo022xTm9tuu4jKlSsB8Mgj/Rkw4D1ycnLo3r0z++23Wyabrw2kpOvirbc+4sEHn2Pq1Jn0738X\nu+zSBICJEydz7bUPAhBj5MILT+GQQ/bOWNuVPoWFhfztb12pVasajzxyPaecciVLl/4KwLx5i9h1\n1yY89FD3DLdS6fbkk6/Sv/+7hBBo2nRbbrvtIsaN+4pevR4nP7+AnXbajh49ulCqVG6mm6q1cPXI\n9MuqpC2EcGgI4esQwpQQQrcSHm8RQhgVQpgUQpgYQjix2GMNQwgfhxC+CSG8GEIokyy/MITwRQjh\nzWJlbUIId6fvzDYOZcqU5qmnevDaaw/w6qv3M2LEOMaP/y8An3/+DYsXL1lt/z59XuKww9rw6qv3\ncc89l3PjjX0y0WxtYMcddxD9+t2wWtm++7bgjTd68/rrD7DttnV55JEBAEyZMp3Bg4czeHBv+vW7\ngRtv7ENhYWEGWq0NraTromnTBjzwwNW0arXTauVNmmzDyy/fw6BB99Ov341cd11vCgq8LjYH//73\n6zRuXK9o+7nnbmfQoPsZNOh+WrZsRvv2+2SwdcqEOXPm8e9/v87LL9/DG2/0prCwkNdfH0a3bvdy\n991X8MYbvdl66xoMHPhBppsqZZWs6bSFEHKB3sBhwI7AySGEHdfYbRnw9xjjTsChwL0hhKrJx24H\n7okxNgEWAGcly88GdgU+AzqEEAJwLXDzhjyfjVEIgYoVywNQUFBAQUEBIQQKCwvp1esJLr+80xr7\nw5IlywD45Zdl1KxZLe1t1obXqtXOVKmyxWplbdrsVvQNaIsWzZg9+2cAPvjgY444oi1lypSmfv3a\nNGhQh4kTv0l7m7XhlXRdNG5cn0aN6v1m3/LlyxVdLytW5JF4G9ambvbsnxk6dAzHH9/+N48tWbKM\n0aMncvDBe2WgZcq0wsKVLF+eR0FBIcuXr6BChXKUKVOahg3rArDvvi15993/ZLiV+j05IX03JWRN\npw1oDUyJMX4bY8wDXgA6Ft8hxjg5xvhN8v4sYC5QI9kRawcMSO76FHBMsaqlgQpAPnA68GaMccGG\nPJmNVWFhIR07dmGffU5nn31a0rx5M555ZjAHHdT6N52yCy44hddfH0rbtmfSufMNdO9+boZarUx6\n+eX3aNt2dyDxDWrt2lsVPVar1lbMmTMvU01TFpkw4WuOOOJfHH30hdx4478c9rQZuPXWR7n88k7k\n5Pz2o8b7749m772bU6lShQy0TJlUq1Z1/vGPYznwwH/Qps3fqVSpIocd1oaCggI+/zzxJd/bb48s\n+jJQUkI2ddrq3GbWnAAAIABJREFUAjOKbc9MlpUohNAaKANMBaoDC2OMBSXUvRMYDdQARgJnAA/9\nUWNCCJ1DCGNDCGP79n1xHU9l45Wbm8ugQfczbNgTTJw4mTFjvuDttz/itNOO+s2+gwcP59hjD2L4\n8Cfp2/cGrrjiblauXJmBVitT+vR5kdzcXI4++gAgMV9pTYYqAmjevBmDBz/EgAF388gj/VmxIi/T\nTdIG9OGHn1CtWhV23nm7Eh9/441hHHFE2zS3Stlg0aIlfPDBx3zwQT9GjHiKX39dzmuvDeXuu6/g\nttv6cfzxXalYsTy5uX6xk81y0nhTQjYtRFLSR7sS1xMNIdQBngbOiDGuDCWPtYkAMcank/sSQrge\nuB84LITwdxKdxEtjjL/pacQY+wJ9E1uTN7t1TStXrsSee+7Cxx9/zvTpP9K+fWcAfv11BYcc0pn3\n3uvLgAHv0q/fjQC0bLk9K1bksWDBYqpXr/p7h9YmYuDADxg6dAxPPnlL0XC32rW3Wu3b0TlzfqZm\nzeqZaqKyUOPG9SlfvhyTJ39ftFCJNj3jxn3FkCGfMHz4p6xYkceSJcu47LK7uPPOS1mwYDGff/4N\nvXtfk+lmKgP+85/x1KtXi2rVqgDQvv0+fPbZV3TseCDPPXc7AB99NI5p037IZDOlrJNNHdiZQP1i\n2/WAn0MI45O3owFCCJWBwUD3GOPo5L4/A1VDCKWK1Z1V/OAhhK2BVjHGQUB34ERgBXDQhjqhjc38\n+YuKFhtZvnwF//nPeHbaqTEjRz7NkCGPMWTIY5QvX5b33kv0ZevUqcGoURMAmDp1BitW5Be9CWvT\nNnz4pzz66Mv06XMt5cuXKypv1641gwcPJy8vnxkzZjNt2ix23dUP5pu7GTNmFy088sMPc/nuux+o\nW7dmhlulDenSS89g+PAnGTLkMe6++wr22mtX7rzzUiAx9O2AA1pRtmyZDLdSmbD11jWYMOG//Prr\ncmKMjBo1gcaN6zNv3kIA8vLyefTRlznppMMy3FIpu2RT0jYGaBJCaAj8AJwEnBJjvHHVDsnVHwcC\n/44x9l9VHmOMIYQPgeNJzIU7Axi0xvFvJrEACUB5EkncShJz3QTMnTufbt3upbBwJTGu5NBD23Dg\nga3Xun+3bmfRvfuDPPnkIEII9Ox5kQsMbIK6dr2DTz75nAULFtO27ZlceOEp9O07gLy8fDp1SvyT\nat68GTfddD5NmjTgsMPacPjh/yI3N5frrjvPIS6bqJKui6pVt+Dmmx9h/vxFnHvuTeywQ0Mee+wm\nPv30Sx59dAClSpUiJydwww3n+QXPZuzNN4dzzjnHZ7oZypDmzZvRocO+HHvsxZQqlcsOOzTixBMP\n5Z57nmbo0DGsXBk5+eTD2Hvv5pluqn6HH/fSL5Q0ByVTQgiHA/cCucDjMcYeazx+GvAEMKlY8Zkx\nxvEhhEYkOmzVSKwUeVqMcUWyXkvgghjjWcnti4FzSAyP7Lhqv7Xb/IZH6o80BSZnuhHKOl4XKonX\nhUridaE1NYWSpwtlnU9+Gpy2z8ataxyxUbwmG1pWddqyl502rck/tiqJ14VK4nWhknhdaE0bT6dt\nTBo7ba3stAHZNadNkiRJkrSGbJrTJkmSJCnLOact/UzaJEmSJCmLmbRJkiRJSpmpT/r5mkuSJElS\nFjNpkyRJkpSyEFxYPd1M2iRJkiQpi5m0SZIkSUqZi0emn0mbJEmSJGUxkzZJkiRJKfN32tLPpE2S\nJEmSsphJmyRJkqSUGbSln0mbJEmSJGUxO22SJEmSlMUcHilJkiQpZTmOj0w7kzZJkiRJG7UQQm4I\n4bMQwhvJ7YYhhI9DCN+EEF4MIZRJlpdNbk9JPr5tsWNclSz/OoTQoVj5ocmyKSGEbuk+N7DTJkmS\nJGkdhDTe1sFFwFfFtm8H7okxNgEWAGcly88CFsQYtwPuSe5HCGFH4CRgJ+BQ4KFkRzAX6A0cBuwI\nnJzcN63stEmSJEnaaIUQ6gFHAP2S2wFoBwxI7vIUcEzyfsfkNsnHD0ru3xF4Ica4Isb4HTAFaJ28\nTYkxfhtjzANeSO6bVnbaJEmSJKUshHTeQucQwthit84lNOle4ApgZXK7OrAwxliQ3J4J1E3erwvM\nAEg+vii5f1H5GnXWVp5WLkQiSZIkKSvFGPsCfdf2eAjhSGBujPHTEMIBq4pLOtQfPLa28pJCrlhC\n2QZlp02SJElSyrJs8ch9gaNDCIcD5YDKJJK3qiGEUsk0rR4wK7n/TKA+MDOEUAqoAswvVr5K8Tpr\nK08bh0dKkiRJ2ijFGK+KMdaLMW5LYiGRITHGU4EPgeOTu50BDErefy25TfLxITHGmCw/Kbm6ZEOg\nCfAJMAZoklyNskzyOV5Lw6mtxqRNkiRJUsqyLGlbmyuBF0IItwCfAY8lyx8Dng4hTCGRsJ0EEGOc\nFEJ4CfgSKADOjzEWAoQQLgDeAXKBx2OMk9J6JkBIdCz1+yb7ImkNTYHJmW6Eso7XhUridaGSeF1o\nTU1hI+kP/XfhG2n7bLx91SM3itdkQzNpkyRJkpSyHLtRaeecNkmSJEnKYiZtkiRJklJm0JZ+Jm2S\nJEmSlMVM2iRJkiSlLATX6Es3kzZJkiRJymImbZIkSZJS5py29DNpkyRJkqQsZqdNkiRJkrKYwyMl\nSZIkpSw4PjLtTNokSZIkKYuZtEmSJElKmalP+vmaS5IkSVIWM2mTJEmSlDLntKWfnbaUNM10A5SV\nvC5UEq8LlcTrQiXxupCUGjttkiRJklJm0JZ+dtpSsLxwdKaboCxTLncvluQPyXQzlGUqlW7HlMWv\nZ7oZyjLbVT6KXhPfy3QzlGWu2PUQym9zcqaboSzy6/TnM90EZTE7bZIkSZJS5py29HP1SEmSJEnK\nYiZtkiRJklJm0JZ+Jm2SJEmSlMVM2iRJkiSlLMeoLe1M2iRJkiQpi5m0SZIkSUqZQVv6mbRJkiRJ\nUhaz0yZJkiRJWczhkZIkSZJSFkLMdBM2OyZtkiRJkpTFTNokSZIkpcyFSNLPpE2SJEmSsphJmyRJ\nkqSUBaO2tDNpkyRJkqQsZtImSZIkKWUGbeln0iZJkiRJWcykTZIkSVLKTH3Sz9dckiRJkrKYSZsk\nSZKklLl6ZPqZtEmSJElSFjNpkyRJkrQOjNrSzaRNkiRJkrKYSZskSZKklAWTtrQzaZMkSZKkLGan\nTZIkSZKymMMjJUmSJKUsBHOfdPMVlyRJkqQsZtImSZIkaR24EEm6mbRJkiRJUhYzaZMkSZKUMpf8\nTz+TNkmSJEnKYiZtkiRJktaBSVu6mbRJkiRJUhYzaZMkSZKUMn+nLf18xSVJkiQpi5m0SZIkSVoH\nzmlLN5M2SZIkScpiJm2SJEmSUubvtKWfnbbN0HXX9GP4sPFUq1aZV167FYB33/6EPr0H8t23P/Ls\ni9ez084NAfh84lRuvv5JACKR884/hoMO3oMVK/Lo9Pdbyc8roKCgkEPat+JfFx4HwPPPvsez/36X\n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\ndr69ky59ejLqsgm8+LMnWfZIZdGIhqGDOf7MYbv3X79sBfVHdqNrn567H6vv0Y1Tzx/LQ1+9mUM6\ndKBzrx6M+vwEAFY+uYQ5037IW9samXHT7RzZ0J+zJ0+q7UGqRd/7p79m5IcH0rN7F1Y8eSs3Tr2P\nzvWduOTCMQD8+8PzuOvfZrX4OlddP51/uWUS7+tYx8rVrzDx6u8A8I+3/Qd3f/sKLhp/Bv+79jX+\n/K9uBuDhxxbx0TMH8+zjN/Pm9l9xSXV/6WAWZboGuJkl/x/OzC9FxEpgSGZujIiLq9uTqs9ZCQwB\nTgKuB16lMqdtNnBZZjZFxDeBTwALq/PaiIjbgS3VOW+/lZdHam+dOgyjccdjRZehkunccTQrtv1n\n0WWoZD7Q9Y/4h6Uziy5DJfPFkz/CYcf+WdFlqES2r/4B0D7W0n/j7dk1+9u4vm5UuzgnB1qpkrbM\n7LCPxxv22J5OZSGS3/haNT59MzPHs5fMvBa4dtf96gIkw4Dz995XkiRJksqkPc1pe09ExCBgBfBo\nZr5YdD2SJElSexI1/KeKUiVt70ZmzgJmtWK/54ABB7oeSZIkSXovHDRNmyRJkqRa+J27WK9wnnFJ\nkiRJKjGTNkmSJEmt5lyz2jNpkyRJkqQSM2mTJEmS1GrVj9pSDZm0SZIkSVKJmbRJkiRJagOTtloz\naZMkSZKkErNpkyRJkqQS8/JISZIkSa0W5j415xmXJEmSpBIzaZMkSZLUBi5EUmsmbZIkSZJUYiZt\nkiRJklrND9euPZM2SZIkSSoxkzZJkiRJbWDSVmsmbZIkSZJUYiZtkiRJklrNz2mrPc+4JEmSJJWY\nSZskSZKkNnBOW62ZtEmSJElSiZm0SZIkSWq1MGmrOZM2SZIkSSoxkzZJkiRJrRZh0lZrJm2SJEmS\nVGI2bZIkSZJUYl4eKUmSJKkNzH1qzTMuSZIkSSVm0iZJkiSp1Vzyv/ZM2iRJkiSpxEzaJEmSJLWB\nSVutmbRJkiRJUomZtEmSJElqNT9cu/ZM2iRJkiSpxEzaJEmSJLWBuU+tecYlSZIkqcRM2iRJkiS1\nmp/TVnuRmUXX0B54kiRJknSgtZNu6IUa/m38e+3knBxYNm1qk4iYmJn/XHQdKg/HhJrjuFBzHBdq\njuNCaplz2tRWE4suQKXjmFBzHBdqjuNCzXFcSC2waZMkSZKkErNpkyRJkqQSs2lTW3nNufbmmFBz\nHBdqjuNCzXFcSC1wIRJJkiRJKjGTNkmSJEkqMZs2SZIkSSoxmza1KCKmRcSGiHim6FpUHhFxTET8\nNCKWRcSzEXFF0TWpeBHRKSLmRcSS6ri4oeiaVB4R0SEiFkXEg0XXonKIiJUR8XRELI6I+UXXI5WV\nc9rUoogYBTQCd2XmSUXXo3KIiH5Av8xcGBFdgAXAuZn5XMGlqUAREUB9ZjZGREfgCeCKzJxbcGkq\ngYi4ChgCdM3Mc4quR8WLiJXAkMzcWHQtUpmZtKlFmTkb2FR0HSqXzFyXmQur268Dy4D+xValomVF\nY/Vux+rNdwdFRBwNfBy4s+haJKm9sWmT9K5FRANwKvBksZWoDKqXwC0GNgAzM9NxIYCbgS8CTUUX\nolJJYEZELIiIiUUXI5WVTZukdyUiOgP3A1dm5rai61HxMnNnZg4GjgaGRoSXVf+Oi4hzgA2ZuaDo\nWlQ6wzPz94GxwOerUzIk7cWmTdJ+q85Zuh+4JzN/VHQ9KpfM3ALMAs4uuBQVbzjwier8pXuB0RFx\nd7ElqQwyc231/w3AA8DQYiuSysmmTdJ+qS448V1gWWZOLboelUNE9IqIbtXtw4CzgOXFVqWiZeZ1\nmXl0ZjYAnwQey8wJBZelgkVEfXUhKyKiHhgDuFK11AybNrUoIn4AzAFOiIg1EfHZomtSKQwH/oLK\nO+aLq7ePFV2UCtcP+GlELAWeojKnzeXdJTWnD/BERCwB5gEPZebDBdcklZJL/kuSJElSiZm0SZIk\nSVKJ2bRJkiRJUonZtEmSJElSidm0SZIkSVKJ2bRJkiRJUonZtEmSChcRsyJiSHV7ZUT0LLomSZLK\nwqZNknTARYW/cyRJ2g/+ApUkNSsiroqIZ6q3KyPimxFx2R5fnxIRf1PdviYinoqIpRFxQ/WxhohY\nFhG3AQuBYyLi2xExPyKe3bWfJEn67WzaJEnvEBGnAZ8GPgQMA/4SuBcYv8duFwA/jIgxwPHAUGAw\ncFpEjKrucwJwV2aempmrgL/NzCHAycDpEXFyTQ5IkqR2rK7oAiRJpTQCeCAz3wCIiB8BI4HeEXEU\n0AvYnJmrI+JyYAywqPrczlSauNXAqsycu8frXhARE6n8/ukHDAKW1uKAJElqr2zaJEnNiX08fh8w\nDuhLJXnbte9Nmfmd33iBiAbgjT3uHwdcDXwwMzdHxHSg03tatSRJByEvj5QkNWc2cG5EHB4R9cB5\nwONUGrVPUmnc7qvu+wjwmYjoDBAR/SOidzOv2ZVKE7c1IvoAYw/wMUiSdFAwaZMkvUNmLqwmYfOq\nD92ZmYsAIqIL8HJmrqvuOyMiBgJzIgKgEZgA7NzrNZdExCLgWeAl4Oe1OBZJktq7yMyia5AkSZIk\n7YOXR0ptJtNDAAAAO0lEQVSSJElSidm0SZIkSVKJ2bRJkiRJUonZtEmSJElSidm0SZIkSVKJ2bRJ\nkiRJUonZtEmSJElSif0fHQAiIPi4JEgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1422ee80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_s = reviews.groupby(['overall', '% Upvote']).agg({'Id': 'count'})\n",
    "df_s = df_s.unstack()\n",
    "df_s.columns = df_s.columns.get_level_values(1)\n",
    "fig = plt.figure(figsize=(15,10))\n",
    "\n",
    "sns.heatmap(df_s[df_s.columns[::-1]].T, cmap = 'YlGnBu', linewidths=.5, annot = True, fmt = 'd', cbar_kws={'label': '# reviews'})\n",
    "plt.yticks(rotation=0)\n",
    "plt.title('How helpful users find among the user scores')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Removing the rating of 3, and convert the reviews into binary, 1- positive, 0- negative\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df =  reviews[reviews['overall'] != 3]\n",
    "X = df['reviewText']\n",
    "y_dict = {1:0, 2:0, 4:1, 5:1}\n",
    "y = df['overall'].map(y_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Performing logistic regression on word count:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 115341\n",
      "# train records: 318349\n",
      "# test records: 106117\n",
      "Model Accuracy: 0.9335921671362741\n",
      "\n",
      "-Top 20 positive-\n",
      "Coefficient          Word\n",
      "   2.514600    pleasantly\n",
      "   2.511411         voila\n",
      "   2.247089         habit\n",
      "   2.217369         saves\n",
      "   2.117423   compliments\n",
      "   2.065625      exceeded\n",
      "   2.054146       softest\n",
      "   2.030774     subscribe\n",
      "   1.996177        intent\n",
      "   1.898054          bzzz\n",
      "   1.870532   reservation\n",
      "   1.869156           190\n",
      "   1.849694   transformed\n",
      "   1.847207         comet\n",
      "   1.828497         loves\n",
      "   1.815839         evens\n",
      "   1.811722        highly\n",
      "   1.807103  apprehensive\n",
      "   1.806595     skeptical\n",
      "   1.789965     thickener\n",
      "\n",
      "-Top 20 negative-\n",
      "Coefficient            Word\n",
      "  -2.096658         defeats\n",
      "  -2.100043             dud\n",
      "  -2.107460           waste\n",
      "  -2.163246          poorly\n",
      "  -2.175272    unflattering\n",
      "  -2.225249        goodwill\n",
      "  -2.262640             o_o\n",
      "  -2.271387      downgraded\n",
      "  -2.271431            poor\n",
      "  -2.413179         useless\n",
      "  -2.413474           shame\n",
      "  -2.416034            tugs\n",
      "  -2.423743          zenana\n",
      "  -2.478651      returnable\n",
      "  -2.515375          flaked\n",
      "  -2.534732     downgrading\n",
      "  -2.548932      unwearable\n",
      "  -2.624538   disappointing\n",
      "  -2.671644  disappointment\n",
      "  -3.013195          tressa\n"
     ]
    }
   ],
   "source": [
    "c = CountVectorizer(stop_words = 'english')\n",
    "\n",
    "def text_fit(X, y, model,clf_model,coef_show=1):\n",
    "    \n",
    "    X_c = model.fit_transform(X)\n",
    "    print('# features: {}'.format(X_c.shape[1]))\n",
    "    X_train, X_test, y_train, y_test = train_test_split(X_c, y, random_state=0)\n",
    "    print('# train records: {}'.format(X_train.shape[0]))\n",
    "    print('# test records: {}'.format(X_test.shape[0]))\n",
    "    clf = clf_model.fit(X_train, y_train)\n",
    "    acc = clf.score(X_test, y_test)\n",
    "    print ('Model Accuracy: {}'.format(acc))\n",
    "    \n",
    "    if coef_show == 1: \n",
    "        w = model.get_feature_names()\n",
    "        coef = clf.coef_.tolist()[0]\n",
    "        coeff_df = pd.DataFrame({'Word' : w, 'Coefficient' : coef})\n",
    "        coeff_df = coeff_df.sort_values(['Coefficient', 'Word'], ascending=[0, 1])\n",
    "        print('')\n",
    "        print('-Top 20 positive-')\n",
    "        print(coeff_df.head(20).to_string(index=False))\n",
    "        print('')\n",
    "        print('-Top 20 negative-')        \n",
    "        print(coeff_df.tail(20).to_string(index=False))\n",
    "    \n",
    "    \n",
    "text_fit(X, y, c, LogisticRegression())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It can be observed that the words with highest positive and negative coefficient don't make sense (such as 190 and 0_0), even if the accuracy is high. Baseline accuracy of the model is as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 115341\n",
      "# train records: 318349\n",
      "# test records: 106117\n",
      "Model Accuracy: 0.79635685139987\n"
     ]
    }
   ],
   "source": [
    "text_fit(X, y, c, DummyClassifier(),0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TF-IDF vectorizer is added to logistic regression to improve the model accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 115341\n",
      "# train records: 318349\n",
      "# test records: 106117\n",
      "Model Accuracy: 0.9362401877173309\n",
      "\n",
      "-Top 20 positive-\n",
      "Coefficient         Word\n",
      "  12.899817         love\n",
      "  11.274942        great\n",
      "  10.658143      perfect\n",
      "   8.761444       highly\n",
      "   8.339233      amazing\n",
      "   7.689518  compliments\n",
      "   7.547291  comfortable\n",
      "   7.474470        loves\n",
      "   7.394395      pleased\n",
      "   7.253354    excellent\n",
      "   7.087920         best\n",
      "   7.062837         nice\n",
      "   6.859655         glad\n",
      "   6.559846      awesome\n",
      "   6.450318    perfectly\n",
      "   6.182394         easy\n",
      "   6.111311        helps\n",
      "   5.886704        works\n",
      "   5.710404       little\n",
      "   5.602147        happy\n",
      "\n",
      "-Top 20 negative-\n",
      "Coefficient            Word\n",
      "  -4.986251            didn\n",
      "  -4.999510           hopes\n",
      "  -5.075813         cheaply\n",
      "  -5.202377   uncomfortable\n",
      "  -5.707273           awful\n",
      "  -5.841036       returning\n",
      "  -5.906482          poorly\n",
      "  -5.992559           shame\n",
      "  -5.996539           broke\n",
      "  -6.032897           worse\n",
      "  -6.101499        terrible\n",
      "  -6.259978        horrible\n",
      "  -6.795378         useless\n",
      "  -7.099506  disappointment\n",
      "  -7.146786           worst\n",
      "  -7.295192        returned\n",
      "  -7.852853            poor\n",
      "  -7.861852   disappointing\n",
      "  -8.145350    disappointed\n",
      "  -8.495580           waste\n"
     ]
    }
   ],
   "source": [
    "tfidf = TfidfVectorizer(stop_words = 'english')\n",
    "text_fit(X, y, tfidf, LogisticRegression())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Accuracy with tfidf has increased from 79.5 to 93.6. Logistic regression is now performed on TFIDF + n-grams. It can also be observed that words that don't indicate polarity of the sentiment are removed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 1399772\n",
      "# train records: 55402\n",
      "# test records: 18468\n",
      "Model Accuracy: 0.9860298895386614\n",
      "\n",
      "-Top 20 positive-\n",
      "Coefficient         Word\n",
      "   1.955933  comfortable\n",
      "   1.742090          fit\n",
      "   1.444603         size\n",
      "   1.357627       colors\n",
      "   1.253705        brush\n",
      "   1.240617        great\n",
      "   1.219507        price\n",
      "   1.183615         wear\n",
      "   1.085954      perfect\n",
      "   1.036946         warm\n",
      "   0.947524           34\n",
      "   0.945416    recommend\n",
      "   0.900329           ve\n",
      "   0.840110         pair\n",
      "   0.815484        tight\n",
      "   0.807658        stays\n",
      "   0.787403    expensive\n",
      "   0.748784      regular\n",
      "   0.743777        pairs\n",
      "   0.736027       bought\n",
      "\n",
      "-Top 20 negative-\n",
      "Coefficient         Word\n",
      "  -1.026397      tanning\n",
      "  -1.030792         tree\n",
      "  -1.032944     tea tree\n",
      "  -1.038905         pura\n",
      "  -1.072709       lotion\n",
      "  -1.089293         para\n",
      "  -1.092551        haven\n",
      "  -1.159800        argan\n",
      "  -1.167655           es\n",
      "  -1.187189          oil\n",
      "  -1.187743  conditioner\n",
      "  -1.216978         item\n",
      "  -1.283853         used\n",
      "  -1.346056          que\n",
      "  -1.433081         skin\n",
      "  -1.484918    body wash\n",
      "  -1.821351           la\n",
      "  -1.896799         dove\n",
      "  -2.052432      results\n",
      "  -2.695226      product\n"
     ]
    }
   ],
   "source": [
    "tfidf_n = TfidfVectorizer(ngram_range=(1,2),stop_words = 'english')\n",
    "text_fit(X, y, tfidf_n, LogisticRegression())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It can be observed that accuracy of LR increased with n-grams to 98.6\n",
    "\n",
    "# Upvote prediction\n",
    "\n",
    "Analysing the pattern of downvotes by users to predict upvotes of the products"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Class distribution:\n",
      "1    72773\n",
      "0     1097\n",
      "Name: % Upvote, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "df = df[df['overall'] == 5]\n",
    "df = df[df['% Upvote'].isin(['0-20%', '20-40%', '60-80%', '80-100%'])]\n",
    "df.shape\n",
    "\n",
    "X = df['reviewText']\n",
    "y_dict = {'0-20%': 0, '20-40%': 0, '60-80%': 1, '80-100%': 1}\n",
    "y = df['% Upvote'].map(y_dict)\n",
    "\n",
    "print('Class distribution:')\n",
    "print(y.value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It can be observed that the upvotes are skewed towards positive side. To avoid it, resampling the data has to be performed. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Percentage of upvote transactions:  0.5\n",
      "Percentage of downvote transactions:  0.5\n",
      "Total number of records in resampled data:  2194\n"
     ]
    }
   ],
   "source": [
    "df_s = pd.DataFrame(data = [X,y]).T\n",
    "\n",
    "Downvote_records = len(df_s[df_s['% Upvote'] == 0])\n",
    "Downvote_indices = np.array(df_s[df_s['% Upvote'] == 0].index)\n",
    "\n",
    "Upvote_indices = df_s[df_s['% Upvote'] == 1].index\n",
    "\n",
    "random_upvote_indices = np.random.choice(Upvote_indices, Downvote_records, replace = False)\n",
    "random_upvote_indices = np.array(random_upvote_indices)\n",
    "\n",
    "under_sample_indices = np.concatenate([Downvote_indices,random_upvote_indices])\n",
    "\n",
    "under_sample_data = df_s.loc[under_sample_indices, :]\n",
    "X_u = under_sample_data['reviewText']\n",
    "under_sample_data['% Upvote'] = under_sample_data['% Upvote'].astype(int)\n",
    "y_u = under_sample_data['% Upvote']\n",
    "\n",
    "\n",
    "print(\"Percentage of upvote transactions: \", len(under_sample_data[under_sample_data['% Upvote'] == 1])/len(under_sample_data))\n",
    "print(\"Percentage of downvote transactions: \", len(under_sample_data[under_sample_data['% Upvote'] == 0])/len(under_sample_data))\n",
    "print(\"Total number of records in resampled data: \", len(under_sample_data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, the similar operations as above are performed on the resampled data to measure accuracy of the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 10998\n",
      "# train records: 1645\n",
      "# test records: 549\n",
      "Model Accuracy: 0.5774134790528234\n",
      "\n",
      "-Top 20 positive-\n",
      "Coefficient         Word\n",
      "   0.985616         slip\n",
      "   0.925289  comfortable\n",
      "   0.893796        pairs\n",
      "   0.859238          mix\n",
      "   0.834367      putting\n",
      "   0.825174      pleased\n",
      "   0.821810         warm\n",
      "   0.806312     dandruff\n",
      "   0.804728      mascara\n",
      "   0.799578      forever\n",
      "   0.792720       stones\n",
      "   0.785512  moisturizer\n",
      "   0.781844  beautifully\n",
      "   0.781541        lasts\n",
      "   0.776866   absolutely\n",
      "   0.753448      regular\n",
      "   0.753269     cleaning\n",
      "   0.743428       second\n",
      "   0.738676          bag\n",
      "   0.729880          fit\n",
      "\n",
      "-Top 20 negative-\n",
      "Coefficient      Word\n",
      "  -0.766586      idea\n",
      "  -0.773638    smells\n",
      "  -0.776257      know\n",
      "  -0.777615   results\n",
      "  -0.783954   organic\n",
      "  -0.794479   pimples\n",
      "  -0.805905        ll\n",
      "  -0.808540    taking\n",
      "  -0.816182    called\n",
      "  -0.829431  probably\n",
      "  -0.837078    buying\n",
      "  -0.874064     feels\n",
      "  -0.882610    wouldn\n",
      "  -0.885033      runs\n",
      "  -0.900536      guys\n",
      "  -0.959328      sexy\n",
      "  -0.967436   company\n",
      "  -0.985773      dove\n",
      "  -1.066421   friends\n",
      "  -1.101861      dont\n"
     ]
    }
   ],
   "source": [
    "c = CountVectorizer(stop_words = 'english')\n",
    "\n",
    "text_fit(X_u, y_u, c, LogisticRegression())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "57.7% is the accuracy of the model. Now, the same is performed with n-grams and tf-idf vectorizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# features: 85659\n",
      "# train records: 1645\n",
      "# test records: 549\n",
      "Model Accuracy: 0.6156648451730419\n",
      "\n",
      "-Top 20 positive-\n",
      "Coefficient         Word\n",
      "   1.530252  comfortable\n",
      "   1.479148          fit\n",
      "   1.409056         size\n",
      "   0.893714        price\n",
      "   0.875360           34\n",
      "   0.863019          bag\n",
      "   0.842406         wear\n",
      "   0.840722         cute\n",
      "   0.821837        great\n",
      "   0.812170         ring\n",
      "   0.712774       colors\n",
      "   0.702499         pair\n",
      "   0.675764         warm\n",
      "   0.671117    beautiful\n",
      "   0.638585        style\n",
      "   0.626969      pleased\n",
      "   0.622711      perfect\n",
      "   0.619346      mascara\n",
      "   0.618383        small\n",
      "   0.615437       bought\n",
      "\n",
      "-Top 20 negative-\n",
      "Coefficient         Word\n",
      "  -0.616608         dove\n",
      "  -0.617007         hair\n",
      "  -0.636135          say\n",
      "  -0.638448    love love\n",
      "  -0.665454      friends\n",
      "  -0.671087           la\n",
      "  -0.671131          que\n",
      "  -0.671918         know\n",
      "  -0.681744       smells\n",
      "  -0.717846  conditioner\n",
      "  -0.727255    body wash\n",
      "  -0.738330         good\n",
      "  -0.746810       really\n",
      "  -0.750395          use\n",
      "  -0.879846      results\n",
      "  -0.889193         skin\n",
      "  -0.979081      shampoo\n",
      "  -0.991463         used\n",
      "  -1.018897          oil\n",
      "  -1.597616      product\n"
     ]
    }
   ],
   "source": [
    "tfidf_n = TfidfVectorizer(ngram_range=(1,2),stop_words = 'english')\n",
    "\n",
    "text_fit(X_u, y_u, tfidf_n, LogisticRegression())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The accuracy has improved to 61.56, but still has some words which don't indicate polarity in the top 10/20.\n",
    "\n",
    "# Effect of non-contextual features\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downvote score 5 comments examples:\n",
      "355      I have shoulder length thick hair, but the end...\n",
      "7025     No, I don't use this stuff, but my wife and ma...\n",
      "12280    I use these all the time - usually twice a wee...\n",
      "14883    You can put away all of your Dove bars now--be...\n",
      "15741    im very ashamed to say but ,i went a few days ...\n",
      "Name: reviewText, dtype: object\n",
      "Upvote score 5 comments examples\n",
      "130260    This is such a great investment for any makeup...\n",
      "341618    I had ordered a couple wallets and been very d...\n",
      "146394    This has to be tried. It has literally saved m...\n",
      "388282    I LOVE this shirt.  I've bought about five fla...\n",
      "296772    I'm 5'3&#34; at 160 and got these in Large. Th...\n",
      "Name: reviewText, dtype: object\n"
     ]
    }
   ],
   "source": [
    "#pd.set_option('display.max_colwidth', -1)\n",
    "print('Downvote score 5 comments examples:')\n",
    "print(under_sample_data[under_sample_data['% Upvote']==0]['reviewText'].iloc[:100:20])\n",
    "print('Upvote score 5 comments examples')\n",
    "print(under_sample_data[under_sample_data['% Upvote']==1]['reviewText'].iloc[:100:20])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above are the samples of the reviews that received downvotes and upvotes. The possible features have to be extracted from these reviews."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% Upvote                   0          1\n",
      "word_count        100.304467  94.027347\n",
      "capital_count      22.326345  15.863263\n",
      "question_mark       0.089335   0.055606\n",
      "exclamation_mark    1.078396   0.994531\n",
      "punctuation        16.536007  15.941659\n"
     ]
    }
   ],
   "source": [
    "under_sample_data['word_count'] = under_sample_data['reviewText'].apply(lambda x: len(x.split()))\n",
    "under_sample_data['capital_count'] = under_sample_data['reviewText'].apply(lambda x: sum(1 for c in x if c.isupper()))\n",
    "under_sample_data['question_mark'] = under_sample_data['reviewText'].apply(lambda x: sum(1 for c in x if c == '?'))\n",
    "under_sample_data['exclamation_mark'] = under_sample_data['reviewText'].apply(lambda x: sum(1 for c in x if c == '!'))\n",
    "under_sample_data['punctuation'] = under_sample_data['reviewText'].apply(lambda x: sum(1 for c in x if c in punctuation))\n",
    "\n",
    "print(under_sample_data.groupby('% Upvote').agg({'word_count': 'mean', 'capital_count': 'mean', 'question_mark': 'mean', 'exclamation_mark': 'mean', 'punctuation': 'mean'}).T)\n",
    "\n",
    "X_num = under_sample_data[under_sample_data.columns.difference(['% Upvote', 'reviewText'])]\n",
    "y_num = under_sample_data['% Upvote']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training the model to predict\n",
    "\n",
    "The model is now trained to predict upvotes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Logistic Regression accuracy: 0.4990892531876138\n",
      "SVM accuracy: 0.5701275045537341\n"
     ]
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X_num, y_num, random_state=0)\n",
    "\n",
    "clf_lr = LogisticRegression().fit(X_train, y_train)\n",
    "acc_lr = clf_lr.score(X_test, y_test)\n",
    "print('Logistic Regression accuracy: {}'.format(acc_lr))\n",
    "\n",
    "clf_svm = svm.SVC().fit(X_train, y_train)\n",
    "acc_svm = clf_svm.score(X_test, y_test)\n",
    "print('SVM accuracy: {}'.format(acc_svm))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Accuracy is lower than the count feature and so, it can be determined that these non-contextual features are not the right choice to perform the prediction\n",
    "\n",
    "# Study of user behavior\n",
    "\n",
    "The user behavior has to be analyzed to improve the model performance and understand the underlying reasons for the bad or good reviews. This also gives importance to word choices of a user when giving the reviews."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                Rating count  Rating mean\n",
      "reviewerID                               \n",
      "A2V5R832QCSOMX           265     4.362264\n",
      "ALNFHVS3SC4FV            204     4.034314\n",
      "AKMEY1BSHSDG7            201     4.592040\n",
      "A34BZM6S9L7QI4           190     4.457895\n",
      "AENH50GW3OKDA            168     4.619048\n",
      "A1UQBFCERIP7VJ           165     4.709091\n",
      "ALQGOMOY1F5X9            160     2.293750\n",
      "A3KEZLJ59C1JVH           154     3.662338\n",
      "A3NHUQ33CFH3VM           153     4.496732\n",
      "A2J4XMWKR8PPD0           146     5.000000\n"
     ]
    }
   ],
   "source": [
    "df_user = reviews.groupby(['reviewerID']).agg({'overall':['count', 'mean']})\n",
    "df_user.columns = df_user.columns.get_level_values(1)\n",
    "df_user.columns = ['Rating count', 'Rating mean']\n",
    "df_user = df_user.sort_values(by = 'Rating count', ascending = False)\n",
    "print(df_user.head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Count of ratings is considered to select the user and user with the id ALQGOMOY1F5X9 is randomly chosen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3AAAAJLCAYAAACmIHQNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xu8bWVd7/HvL7d3TFS2ioBuNY5l\nnUJDxTtJecPS8pJpSh6TY8cLpZZUp7SLRVfT7FTeikxNQ1NKKy+JmRm5VfJukBIiIBuVQKEM/Z0/\nxlgwWay192avtVn7Yb3fr9d+rTXHHHPMZ841F8zPfMYYq7o7AAAA7Pu+YaMHAAAAwO4RcAAAAIMQ\ncAAAAIMQcAAAAIMQcAAAAIMQcAAAAIMQcMCmUVWPr6q3XUP39cdV9cvz9/etqk+t47b/uqqOmb//\nkar6h3Xc9jX2HC2733tX1elV9eWqesQ1ff+wK1X1B1X1cxs9DgABB+yzqurMqrp0flN/3hxF++3m\nbbdVVVfVlqVl3f3q7n7g3hvxyrr7Pd19p12tV1XPr6o/3Y3tPaS7T1zruPal5yjJLyZ5SXfv191v\n2oD736n5Z9NVdfdly3ca0FX1sKr656r6SlV9oar+tKoOWrbOgVX1sqo6Z36tf3p+rX/zwjrXr6pf\nraqz5t+J06vqJ6uqFtY5ZR7jdyzb/pvm5UcuLLtzVZ1cVf9RVRdX1buq6l7zdTect//EZdt5XlW9\nt6q+oaoeU1X/WFWXVNUpy9Zbel19eeHfv8zXHVlVX1923dKHEfvNv/OPW9jWTebH/Kj58v5VdWJV\nnT//e/5qz/166+6ndvcvXVP3B7AaAQfs6763u/dLcliSuyT56Q0ez4apybX1v9u3S/KxjRzAYsgu\nW15JnpDki0mOuRrbe1SS1yR5UZIDknxrkq8meU9V7T+vc4sk/5jkRknum+QmSe6a5N1Jvmdhc3+e\n5KgkD53XeUKSY+dtL/rXJJeH17z9I5LsWFh2xyTvTfKRJLdPcpskf5HkbVV1z+6+NMmTk/x2Vd1q\nvs23JHlWkid399fn5+J3kpywk6dg/znI9+vuxag8Z2H5fksfRnT3l5ceU1Vtndf99STbu/uk+fIL\n5+dqW5K7J3lCVT1pJ2O43Go/X4DRXFvfCADXMt19XpK/zRRySZKqOrqqPlRVF1XVZ5d9Gv/389cL\n50/577l8tmSeJXjqPNvwpar6vaUZjaq6TlX9VlVdUFWfqaqnL5+tWlRVd6mqD86zGa9LcoOF646s\nqrMXLj+3qj43r/upqjqqqh6c5GeS/OCyGYtTquoFVfXeJJckucO87EevfPf1u/Nsyier6qiFK86s\nqu9euLw4y7c7z9G9qur987bfvzRLszC2X5pnZS6uqrdV1QErPT/z+k+pqjOq6ovz7M9t5uX/luQO\nSf5yHsf1V7htV9U3LVxe3EX1gKr6q6q6cN72e5ZCt6puU1VvqKod88/xmcuei5NqmhW7KMmPrDL0\n+2aKnOOSPLaqrrfaY1zYdiX5rSS/PM9qXjq/hn8008/xuHnVn0hyUZIndPe/9eTC7v6j7v7deVtH\nJXlgkkd290e7+7Lu/qckP5zkaYvPS5JXZ3oNXWe+/EOZ4uyrC+s8P8n7uvtnu/uL3X1xd784yauS\n/FqSdPffJ3ldkpfMj+VlSX61uz85X/+O7n59knN29VxcHd39tiRvSfLimmYMH5PkaQurfG+SX+/u\nS7r7zCSvSPK/VtpWXTET+OSqOivJ383Lj6hp9vDCqvqX+X5SVY+tqu3LtvETVXXy/P3lr7n58sOq\n6rR5O/9YVd8+L39SVf3lwnpnVNXrFy5/tqoOC8AeEnDAEKrq4CQPSXLGwuKvZJpt2D/J0Ul+rK44\nfup+89elWYD3rbLphyW5W5LvyPRm8UHz8qfM93dYphmRVY/Lmt/QvynTG+CbZ5oteeQq694pydOT\n3K27bzLf35nd/TdJfiXJ61aYsViabblJkn9fYbP3SPLpTLM8z0vyxqq6+WrjXbDT52jexluSvDjJ\nLZL8dpK31DSrs+RxSZ6U5JZJrpfkOas87gck+dVMz/GB8+P4syTp7jsmOSvzbGt3/9dujH3Rs5Oc\nnWRrkltlCuGeI+4vk/xLkoMyzWD9eFU9aOG2D09yUqbX0KtX2f4x83ZeN19+2G6M6U5JbpvptXC5\nefbqDZmCLEm+O8lfzMtX8z1JTu3uzy7b1qmZHvdRC4vPSfLxhe0/McmfrLC9P89VvT7JvavqRvPl\n52b63XhDpg8kfmMnY7w6bllVn5+D+oVVdeNl1/9EkiMz/Vye093nLru+ln3/bbu4v/sn+ZYkD6pp\n99W3JPnlTL+rz0nyhppm/E5OcqeqOnThto/LNIt65QFU3TXJK5P870y/G3+Y5OT5w4d3J7lvTbua\nHpjkuknuPd/uDkn2S/LhXYwZYFUCDtjXvamqLk7y2STnZwqUJEl3n9LdH+nur3f3h5O8NtObtavj\nhHnG46wk78oVM3yPSfKi7j67u7+Une8qdkSmN2m/093/Pe/u9f5V1v1akusnuXNVXbe7z+zuf9vF\nGP+4uz82z7z89wrXn79w369L8qlMQbtWRyc5vbtfNd/3a5N8MtMsyJI/6u5/nXe7e30WZkiXeXyS\nV3b3B+dA++kk96yqbeswzv/OFIW3m5+D93R3Z4qPrd39i9391e7+dKaZpMcu3PZ93f2m+TV06fIN\nzzHz6CSvmZ/7k7J7u1EuzUQuj4+lZVsX1jtv4f6+b57RubiuOJnMAatsZ2lby2c9/yTJE+cPC/Zf\n4cOL1bZ3bqb3BTdLLt+l8WlJvj/TrpNfW2UMq7lgfiwXVtVS2H8y02vkwCQPSPKdmT4YuNz8+/ax\nTLtKvnHZNv8myfE1HRv3TZlm326UnXt+d39l/vn+cJK3dvdb55/525NsT/LQ7r4kyZszzVpmDrlv\nzhR2yz0lyR9296nd/bV5N9D/SnLE/Dq7eH6c98+058Dnajqm8f5J3rOLYAfYKQEH7OseMc9UHZnp\nzdTlb1ar6h41nXxhR1X9R5Kn5qpvZnflvIXvL8n06Xgy7TK3OONxpdmPZW6T5HNzNCxZaaYs3X1G\nkh/PtBvb+VX1Z0u7Eu7Ezu47q9z3rra5O26Tqz6Of880m7Vktedvp9ua4+ALy7a1p34j08zs22o6\nAcjx8/LbJbnNQkRcmGl27lYLt93Vc/v9SS5L8tb58quTPKSuOEZrNRfMXw9c4boDc8UxaV9YXKe7\nT+7u/TPNQi3tqnnBKttZ2tYFy5a9MVMcPSPTrPBKY1ttXF9P8qWFZR9b9vXqOKC795///WYy7Qrd\n3R+f4+kzSX4qyaMWb1RVP5zpGLd3ZN6lc8Ezk1ya5PRMsfXaTLOQO7P4M75dkkcve03cJ1c8H6/J\nHHCZZt/eNIfdcrdL8uxl2zkkV/zevTvTf7PuN39/SqZ4u/98GWCPCThgCN397iR/nOQ3Fxa/JtOn\n44d0902T/EGu2L2qszbnJjl44fIhu1j3oPlYoSW3XW3l7n5Nd98n05vAzhVvUlcb864ey0r3vXRs\n0ldy5RmKW1+N7Z4zj3HRbZN8bhe32+W25t3mbnE1tnVJVnkc8zFcz+7uO2SaHXzWfNzYZ5N8ZiEi\n9u/um3T3Qxe2s6vn4JhMUXpWVZ2XadfD6+aKN/mr+VSmsHj04sJ5t85H5oo38e9M8oja+clp3pHk\nHlV1pddgTWfEPCTzsV1L5uD46yQ/lpUD7h3LxzV7TKYZyZWCZW/pLOwSWVW3zHSikqdk2j3xMVV1\nv8tXno7Ze3x337q7vzXT+5h/3o37WPLZJK9a9pq4cXcvzbC/LckB8zFqP5QVdp9c2M4Llm3nRvMs\ndXJFwN13/v7dEXDAOhFwwEh+J8n3LJwA4CZJvtjd/zm/mX3cwro7Ms0m3GEP7+v1SY6rqoNqOmPg\nc3ey7vsyzdI8s6q2VNUPZDpD3lVU1Z2q6gHzsTL/mWk2YWnXtM8n2baLN/MrueV839etqkdnOt5n\nacbotEwn3rhuVR2eK8927Oo5emuS/1FVj5sf1w8muXOSv7qa40umN8JPqqrD5sf+K5mO6zpzN29/\nWpLH1XRymQdnYVfZ+WQS3zRH7EWZns+vZXpjf1FNJ4254Xzbb6uqu+3OHc7HSx2V6Zi3w+Z/35Ep\nuI+58qp1g8V/84zoc5L83/n5u2FV3TrJyzPNEv/ufNvfzrTL4quq6o41uUkWdkXt7ndkCr03VNW3\nzo/jiEyzgb/f3aevMPyfSXL/VZ7fX0hyr5pOjnPzeXfEZ2Q6Xm5nr/PFB3ydqrpBki1JvmF+3Nfd\njdsdWVW3nR/nIZl2TX7zwiovyTTr9a752LefSvKy+TWT+Tm6xXz/D8l0bOgvL7+fnfjTJN9bVQ9a\negzzmA5Oku6+LNNusr+R6Ri5t6+ynZcleeq8F0BV1Y1rOqnSTebr353ku5LcsLvPTvKeJA/O9KHF\nh67GeAGuQsABw+juHZmO71n6Y7r/J8kv1nSM3M9niq6ldS9J8oIk7513cTriat7dyzJ9Gv/hTG+4\n3pop0q5yHFB3fzXJD2Q6i+GXkvxgrnrszpLrZ3rTekGm3Q9vmenNdnLFiSW+UFUfvBpjPTXJofM2\nX5DkUd39hfm6n0tyx3lcv5CFGYVdPUfzNh6W6SQhX8j0Zvph3b18l71d6u53zmN5Q6YZyzvmysei\n7cpxmWbXLsx0PN3i34o7NNOs0pczxfT/m4+P/Np8m8OSfCbT8/PyJDfdzft8QpLTuvtt865/5/V0\nJskXJ/n2qlo6eca9MoX45f+qast8POITMu0O+YX5cd8tU1idOz8vF2Q6hvI/k/xDpmOnTsv04cSP\nLYzlkZmO0fyb+XH+aaYzMD5jpYF39zndveLfp5uD7z6ZYvTMeVyPTPKg7n7v1XhuLk3y+5lmmS7N\n9DuzK3fN9DP6SqY/n/DRTLtFpqYTEN0nyU8ujPXlmWYyf35e9J2Z/vzBxZlOivP47t7t3Tt7OhHM\nwzP9zu3INJP2k7ny+6HXZDq5zJ/PQbfSdrZnmiV8SabfrTOycBbT7v7XTD+n98yXL8p0oqH37sGx\nhABXUlc+bAKAlcyf9v9Bdy/fpRB2S1U9MNMxW0d192kbPR4AxmQGDmAF8y5vD513HTwo09kv/2Kj\nx8W4evobZz+SacYNAPaIGTiAFdR0+vh3Zzrz5aWZ/nbUcfOuUAAAG0LAAQAADMIulAAAAIMQcAAA\nAIPYstEDSJIDDjigt23bttHDAAAA2BAf+MAHLujurbtab58IuG3btmX79u0bPQwAAIANUVX/vjvr\n2YUSAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIO\nAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABg\nEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEFs2egAj2Xb8WzZ6CNcqZ55w9EYPAQAAhmIG\nDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAAYBACDgAA\nYBC7DLiqemVVnV9VH11YdvOqentVnT5/vdm8vKrqxVV1RlV9uKruujcHDwAAsJnszgzcHyd58LJl\nxyd5Z3cfmuSd8+UkeUiSQ+d/xyb5/fUZJgAAALsMuO7++yRfXLb44UlOnL8/MckjFpb/SU/+Kcn+\nVXXgeg0WAABgM9vTY+Bu1d3nJsn89Zbz8oOSfHZhvbPnZQAAAKzRep/EpFZY1iuuWHVsVW2vqu07\nduxY52EAAABc++xpwH1+adfI+ev58/KzkxyysN7BSc5ZaQPd/dLuPry7D9+6deseDgMAAGDz2NOA\nOznJMfP3xyR588LyJ85nozwiyX8s7WoJAADA2mzZ1QpV9dokRyY5oKrOTvK8JCckeX1VPTnJWUke\nPa/+1iQPTXJGkkuSPGkvjBkAAGBT2mXAdfcPrXLVUSus20mettZBAQAAcFXrfRITAAAA9hIBBwAA\nMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgB\nBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAA\nMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgB\nBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAA\nMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgB\nBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAA\nMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgB\nBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAA\nMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgB\nBwAAMAgBBwAAMAgBBwAAMAgBBwAAMAgBBwAAMIg1BVxV/URVfayqPlpVr62qG1TV7avq1Ko6vape\nV1XXW6/BAgAAbGZ7HHBVdVCSZyY5vLu/Lcl1kjw2ya8leWF3H5rkS0mevB4DBQAA2OzWugvlliQ3\nrKotSW6U5NwkD0hy0nz9iUkescb7AAAAIGsIuO7+XJLfTHJWpnD7jyQfSHJhd182r3Z2koNWun1V\nHVtV26tq+44dO/Z0GAAAAJvGWnahvFmShye5fZLbJLlxkoessGqvdPvufml3H97dh2/dunVPhwEA\nALBprGUXyu9O8pnu3tHd/53kjUnulWT/eZfKJDk4yTlrHCMAAABZW8CdleSIqrpRVVWSo5J8PMm7\nkjxqXueYJG9e2xABAABI1nYM3KmZTlbywSQfmbf10iTPTfKsqjojyS2SvGIdxgkAALDpbdn1Kqvr\n7ucled6yxZ9Ocve1bBcAAICrWuufEQAAAOAaIuAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAG\nIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAA\nAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAG\nIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAA\nAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAG\nIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAA\nAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAG\nIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAA\nAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAG\nIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGIeAAAAAGsaaA\nq6r9q+qkqvpkVX2iqu5ZVTevqrdX1enz15ut12ABAAA2s7XOwL0oyd909zcn+Y4kn0hyfJJ3dveh\nSd45XwYAAGCN9jjgquobk9wvySuSpLu/2t0XJnl4khPn1U5M8oi1DhIAAIC1zcDdIcmOJH9UVR+q\nqpdX1Y2T3Kq7z02S+est12GcAAAAm95aAm5Lkrsm+f3uvkuSr+Rq7C5ZVcdW1faq2r5jx441DAMA\nAGBzWEvAnZ3k7O4+db58Uqag+3xVHZgk89fzV7pxd7+0uw/v7sO3bt26hmEAAABsDnsccN19XpLP\nVtWd5kVHJfl4kpOTHDMvOybJm9c0QgAAAJJMu0GuxTOSvLqqrpfk00melCkKX19VT05yVpJHr/E+\nAAAAyBoDrrtPS3L4ClcdtZbtAgAAcFVr/TtwAAAAXEMEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAE\nHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAA\nwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAE\nHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAA\nwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAE\nHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAA\nwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCAEHAAAwCC2bPQAAACAK9t2/Fs2\negjXGmeecPRGD2FdmYEDAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIAD\nAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAY\nhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYhIAD\nAAAYhIADAAAYhIADAAAYhIADAAAYhIADAAAYxJoDrqquU1Ufqqq/mi/fvqpOrarTq+p1VXW9tQ8T\nAACA9ZiBOy7JJxYu/1qSF3b3oUm+lOTJ63AfAAAAm96aAq6qDk5ydJKXz5cryQOSnDSvcmKSR6zl\nPgAAAJisdQbud5L8VJKvz5dvkeTC7r5svnx2koNWumFVHVtV26tq+44dO9Y4DAAAgGu/PQ64qnpY\nkvO7+wOLi1dYtVe6fXe/tLsP7+7Dt27duqfDAAAA2DS2rOG2907yfVX10CQ3SPKNmWbk9q+qLfMs\n3MFJzln7MAEAANjjGbju/unuPri7tyV5bJK/6+7HJ3lXkkfNqx2T5M1rHiUAAAB75e/APTfJs6rq\njEzHxL1iL9wHAADAprOWXSgv192nJDll/v7TSe6+HtsFAADgCntjBg4AAIC9QMABAAAMQsABAAAM\nQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsAB\nAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAM\nQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsAB\nAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAM\nQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsAB\nAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAM\nQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsAB\nAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAM\nQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsABAAAMQsAB\nAAAMQsABAAAMQsABAAAMYo8DrqoOqap3VdUnqupjVXXcvPzmVfX2qjp9/nqz9RsuAADA5rWWGbjL\nkjy7u78lyRFJnlZVd05yfJJ3dvehSd45XwYAAGCN9jjguvvc7v7g/P3FST6R5KAkD09y4rzaiUke\nsdZBAgAAsE7HwFXVtiR3SXJqklt197nJFHlJbrke9wEAALDZrTngqmq/JG9I8uPdfdHVuN2xVbW9\nqrbv2LFjrcMAAAC41ltTwFXVdTPF26u7+43z4s9X1YHz9QcmOX+l23b3S7v78O4+fOvWrWsZBgAA\nwKawlrNQVpJXJPlEd//2wlUnJzlm/v6YJG/e8+EBAACwZMsabnvvJE9I8pGqOm1e9jNJTkjy+qp6\ncpKzkjx6bUMEAAAgWUPAdfc/JKlVrj5qT7cLAADAytblLJQAAADsfQIOAABgEAIOAABgEAIOAABg\nEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIO\nAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABg\nEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIO\nAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABg\nEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIO\nAABgEAIOAABgEAIOAABgEAJwDmv7AAAEwUlEQVQOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABg\nEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIOAABgEAIO\nAABgEAIOAABgEFs2egAAXLttO/4tGz2Ea40zTzh6o4cAwAYzAwcAADAIAQcAADAIAQcAADAIAQcA\nADAIAQcAADAIAQcAADAIAQcAADAIAQcAADAIAQcAADCILRs9AGDtth3/lo0ewrXKmSccvdFDAABY\nkRk4AACAQQg4AACAQQg4AACAQQg4AACAQTiJCQCwKTkB1PpyAii4ZpiBAwAAGISAAwAAGISAAwAA\nGISAAwAAGISAAwAAGISAAwAAGMReCbiqenBVfaqqzqiq4/fGfQAAAGw26x5wVXWdJL+X5CFJ7pzk\nh6rqzut9PwAAAJvN3piBu3uSM7r709391SR/luThe+F+AAAANpXq7vXdYNWjkjy4u390vvyEJPfo\n7qcvW+/YJMfOF++U5FPrOpDN7YAkF2z0IGAFXpvsy7w+2Vd5bbKv8tpcX7fr7q27WmnLXrjjWmHZ\nVSqxu1+a5KV74f43vara3t2Hb/Q4YDmvTfZlXp/sq7w22Vd5bW6MvbEL5dlJDlm4fHCSc/bC/QAA\nAGwqeyPg3p/k0Kq6fVVdL8ljk5y8F+4HAABgU1n3XSi7+7KqenqSv01ynSSv7O6Prff9sFN2TWVf\n5bXJvszrk32V1yb7Kq/NDbDuJzEBAABg79grf8gbAACA9SfgAAAABiHgAAAABiHggL2mqr65qo6q\nqv2WLX/wRo0JkqSq7l5Vd5u/v3NVPauqHrrR44LlqupPNnoMsJKqus/8384HbvRYNhsnMbkWq6on\ndfcfbfQ42Jyq6plJnpbkE0kOS3Jcd795vu6D3X3XjRwfm1dVPS/JQzKdifntSe6R5JQk353kb7v7\nBRs3Ojazqlr+Z5cqyXcl+bsk6e7vu8YHBbOq+ufuvvv8/VMy/T/+L5I8MMlfdvcJGzm+zUTAXYtV\n1VndfduNHgebU1V9JMk9u/vLVbUtyUlJXtXdL6qqD3X3XTZ0gGxa82vzsCTXT3JekoO7+6KqumGS\nU7v72zd0gGxaVfXBJB9P8vIknSngXpvpb+qmu9+9caNjs1v8f3dVvT/JQ7t7R1XdOMk/dff/3NgR\nbh7r/nfguGZV1YdXuyrJra7JscAy1+nuLydJd59ZVUcmOamqbpfp9Qkb5bLu/lqSS6rq37r7oiTp\n7kur6usbPDY2t8OTHJfkZ5P8ZHefVlWXCjf2Ed9QVTfLdAhWdfeOJOnur1TVZRs7tM1FwI3vVkke\nlORLy5ZXkn+85ocDlzuvqg7r7tOSZJ6Je1iSVybxKR0b6atVdaPuviTJdy4trKqbJhFwbJju/nqS\nF1bVn89fPx/v1dh33DTJBzK9x+yqunV3nzcf5+6D2WuQ/yiM76+S7Lf0JnlRVZ1yzQ8HLvfEJFf6\nRK67L0vyxKr6w40ZEiRJ7tfd/5Vc/oZ5yXWTHLMxQ4IrdPfZSR5dVUcnuWijxwNJ0t3bVrnq60m+\n/xocyqbnGDgAAIBB+DMCAAAAgxBwAAAAgxBwAAAAgxBwAAAAgxBwAAAAg/j/6AX3it6c+WAAAAAA\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a8be77d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_user(reviewerID):\n",
    "    df_1user = reviews[reviews['reviewerID'] == reviewerID]['overall']\n",
    "    df_1user_plot = df_1user.value_counts(sort=False)\n",
    "    ax = df_1user_plot.plot(kind = 'bar', figsize = (15,10), title = 'Rating distribution of user {} review'.format(reviews[reviews['reviewerID'] == reviewerID]['reviewerID'].iloc[0]))\n",
    "    plt.show()\n",
    "\n",
    "plot_user('ALQGOMOY1F5X9')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It can be observed that the user is skeptical of most of the products and hence, reviews are biased towards negative"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                Rating count  Rating mean\n",
      "reviewerID                               \n",
      "A1RRMZKOMZ2M7J           125     3.272000\n",
      "A2P739KOM4U5JB           117     3.487179\n",
      "ARYSDAZNRXN6G            115     3.495652\n",
      "A2LW5AL0KQ9P1M           107     3.261682\n",
      "APYKGTU0LFICH             82     2.865854\n"
     ]
    }
   ],
   "source": [
    "print(df_user[(df_user['Rating mean']<3.5) & (df_user['Rating mean']>2.5)].head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, one of the users with mean rating near 3 (A1RRMZKOMZ2M7J) is chosen to perform the analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAJLCAYAAACWrGUsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmUZWdd7+Hvz3QYFBYB02AISIsi\nil5ptAlBBCJhCAQFBRT0QnAKKAguuV4jLhUHNF5FRK/KDYJEZJ5HGUSCgIo0ECEYZiJDEtIMMYQw\nmPC7f+xdcKhUpaq7q7peup5nrV5dZ+999n7r1Onu8znvPruruwMAAMA4vm6rBwAAAMBXE2oAAACD\nEWoAAACDEWoAAACDEWoAAACDEWoAAACDEWrA17yq+smqevUhOtZTq+r35q9vX1Xv2cB9/31VnTJ/\n/eCqeuMG7vuQPUbLjnu7qnpfVV1aVfc+1MeHg1VV76qqE7Z6HMD2I9SAQ66qzquqz80v3i+c4+da\n67zvrqrqqtqxtKy7n97dd928Ea+su9/Q3Tdfa7uqekxV/d069nf37j7zYMc10mOU5HeS/N/uvlZ3\nv2gLjn+V5p9NV9Vxy5YfU1Uvqarz5/W7lq0/q6o+Pz+HP1FVL6iqY5bt97/n9RdX1T9X1W0X1p8w\n7/cFy/Z7y3n5WfPtR8/7WPz12XmbB83bnFdVd17Yx/2r6tNVdcf59tWr6g+q6sPzn7v3VdWvVFUt\n+366qm65bDwvmpefMN9ePpZL5+/zg/P6k6vqjfP3fGFVPamqrn0Ax3nismN8oao+s2w/P3sVP9oN\n093f1d1nHYpjASwSasBW+aHuvlaS3UluleTXtng8W6Ymh+vfxzdJ8q6tHMBisC5bXkkemORTSU5Z\ntvpLSV6Z5D5XseuHz8/hb0tyrSR/vGz9s+f1Ryd5XZLnLlu/L8n3V9U3Liw7Jcl7l2509+/Pkfvl\nX0ken+Q/kjx/he/plCR/keTk7n79vPi5SU5Mco8k156/51OTPGHZ3d+b5EEL+/rGJMfP41waz/Kx\nfHumx+/35k2uM399wyTfmeRGSf7oAI7z0GXHeWau/Pity2o/f4DRHa4vDICvEd19YZJXZQq2JF9+\nV/7tVXVJVX2kqh6zcJd/mn+/eH6n/bbLTxOc35l/6Dxz8Omq+oul2YOqOqKqHjfPgnyoqh6+fPZp\nUVXdqqreVlWfqapnJ7nGwroTquqjC7d/tao+Nm/7nqo6sapOSvLoJD8+j/ff523PqqrHVtWbklyW\n5KYrzBJUVf15Vf1XVb27qk5cWLF8FmVx1m49j9H3V9Vb5n2/paq+f2HdWVX1u1X1pvl7eXVVHb3S\n4zNv/3NV9f6q+lRNs1A3nJd/IMlNk7x0HsfVV7hvV9W3LdxePLX06Kp62Tw786mqesNS0FbVDavq\n+VW1b/45PmLZY/G8qvq7qrokyYNXGfrtMwXFI5Pcv6qutrSiuz/e3X+Z5C2rfd8L216c5EVZeA4v\nW395kqcnObaqdi6s+uJ8v/vP4z4iyY/N266oqu6R5BFJ7tvdn1227tQkj0tyt+7+53nZiUnumuQ+\n3X1Od1/e3f+a5H8medjiYz8f98fncSTJA5K8cB7nSmPZkeQ5SV7a3U+Zv9dndPcru/uy7v50kicl\nud2yu+7vcb4hUzCva7Z5fq6/qaoeX1WfSvKYeflPV9W5898Jr6qqm8zLn1hVf7xsHy+uql+ev/7y\nn7Wq+rqqOq2qPlBVn6yq51TV9eZ1Z1bVo+avj52f278w3/62+TlcAVgnoQZsqaq6UZK7J3n/wuLP\nZnrH/agkJyf5+frK55vuMP9+1Pxu+7+ssut7Jrl1kltmevF7t3n5z83H253ke5Os+rmp+YX7i5I8\nLcn1Mr2jv+IMS1XdPMnDk9y6u689H++87n5lkt/PPLvS3YunfC3NbFw7yX+usNvbJPlgphmZ30ry\ngqUXhWu4ysdo3sfLk/xZkm9M8idJXl5fPbPzE0l+Ksn1k1wtyf9a5fu+U5I/yPQYHzN/H89Kku7+\n1iQfzjx72t1fWMfYFz0qyUeT7Exyg0zB23OsvTTJvyc5NtNs0S9V1d0W7nuvJM/L9BxaLXxOmffz\n7Pn2PfdzfEm+PCP0o/nq5/Di+qtlej5/Msmnl63+23xldulumWYfz19lP7syPRdP7e5zl63++SS/\nm+TE7t67sPwuSd7c3R9Z3Li735zpsT1xYfH5mWbqlk6RfdA8vtX8nyTfkOl5v5o75Mozqvt7nPtk\nmm37p6vYZrmlPzvXT/LY+e+PR2f6Oe1M8oZMs3RJ8oxM4bj0Zs5157E9a4X9PiLT3xl3zBT5n840\ng5kkr09ywvz1Hefj33G+fYckb+ju3o/vAdjmhBqwVV5U02dOPpLkokwhkiTp7rO6+53d/aXufkem\nF1R3XGU/qzm9uy/u7g9nOu1sabbjx5I8obs/Or/jf/pV7OP4JEcm+dPu/u/ufl5Wn2G5IsnVk9yi\nqo7s7vO6+wNrjPGp3f2ueZbjv1dYf9HCsZ+d5D2ZwvVgnZzkfd39tPnYz0zy7iQ/tLDN33T3e7v7\nc5lmTVacLUryk0me0t1vm0Ps15LctpZ9pusA/Xem+LvJ/BgsvdC9dZKd3f073f3F7v5gppmb+y/c\n91+6+0Xzc+hzy3dcVV+f5H5JnjE/9s/LlU9/XMufVdV/JflEppj+xWXrf6yqLk7yuUxvENx3nl37\nsnnm63pz6K8aLPNs5HOTPL27VwqIuyT51yTvXLb86CQXrDL+C+b1i/42yYPm8Ry12hshVXWfTCF/\nn+7+/Crb3CXTY/qbK6xe13FmpyT52/2MnPO7+8/n5/fnkjwkyR9097nzz+D3k+yeZ9XekKQzzbAm\nyX0zPX9WCuaHJPn1+e+PL2SarbvvPLv4+iS3n99IuEOmkF2aTbzjvB5g3YQasFXuPc88nZDkO7Lw\ngrGqblNVr5tPa/uvJA/NlV9QruXCha8vy/QZomR6F3xxduGrZhqWuWGSjy17gbjSzFe6+/1JfinT\nC7eLqupZS6cAXoWrOnZWOfZa+1yPG+bK38d/ZpqdWrLa43eV++ruSzPNHB27yvb7448yzVK9uqo+\nWFWnzctvkuSG8ymRF88x9OhMs25L1npsfyTJ5UleMd9+epK7Lzs1cS2P6O7rJPmeJNfN9HmsRc/p\n7qPmcZ2T5PtW2c/TMs1K/WCmUwBX8oR5vI9aZf1DM31e7K+XnV73iUyxu5Jj5vWLXpDkTpmi82kr\n3amqbpbkyUkePEfyStscn2mm6r7d/d4VNlnzOPN+bpwpcq5qxm0ly3/+N0nyhIXny6eSVJJj5z9j\nz8p0CmYyzSavNgt7kyQvXNjPuZnepLnB/MbMpZne1Lh9kpclOX+OUaEG7DehBmyp+YIHT81XX4jh\nGUlekuTG8wvhJ2Z6UZVM73wfjAvy1S+ob7zGtscue+H7zattPH8+5wcyvZjrJH+4tGq1u6wx1pWO\nvfQu/2eTfP3Cum/aj/2eP49x0Tcn+dga91tzX/Pnib5xP/Z1WVb5Prr7M939qO6+aabZvl+eP3P1\nkSQf6u6jFn5du7vvsbCftR6DUzLF54er6sJMs1VH5isv1tetu9+Z6QIaf7Hs57W0/hOZZmIeUwtX\nhlzwtCS/kOQV3X3Z8pVV9cBMp//92Cozr8k0+3pipkD4y4Xl/5DkNnPwLO7zuEzP/X9cNtbLkvx9\nplMprxRQ80zk85M8sbtfvNJAqupWmf78/nR3v3albdY6zoIHJfnn1YLwKiz/+X8kyUOWPWeuufRZ\nvkyz9vedZ9hukxUu1LKwn7sv2881unvp+f76TDNyV5uXvX7+Hq6b5Oz9/B6AbU6oASP40yR3qaql\n0+uuneRT3f35+QXlTyxsuy/TFflueoDHek6SR84f9j8qya9exbb/kmkW4xFVtaOqfjTJcSttWFU3\nr6o7zaeofT7T6W5XzKs/nmRX7f+VHa8/H/vIqrpfpqvoLc0AnZ3pAhhHVtWeTC8Ol6z1GL0iybdX\n1U/M39ePJ7lFphmA/fWMJD9VVbvn7/33M30m6rx13v/sJD9R00VeTsrCKa5Vdc/5IgyV5JJMj+cV\nSf4tySU1XbzlmvN9v7uqbr2eA1bV0ufa7plp9mN3ps8y/mEWTn+sqmtkOp01Sa4+317NmZl+Xj+8\n0srufnemi+b87xXWfWj+vn99hbF+d6bw+snlnzNbYT/nZ5qlOqmqHj8v+4ckr03y/Kr6rvmxOj7T\njNFfdff7VtjVo5PccZWf4V9lmo260lgXxvvKJL/Y3S+9qvGucZwlD8r0Rs7BemKSX6uq75rHeZ35\nz1SSpLvfnunPzV8neVVPF4hZbT+Pra9ciGRnVd1rYf3rM82OLn2e7qxMs4Zv7O4rArAfhBqw5bp7\nX6ZTm35jXvQLSX5n/gzbb2aKq6VtL0vy2CRvmk8/On4/D/ekJK9O8o4kb88ULZfnK1G1OK4vZrr4\nwIMzXTTgxzOdsrWSq2f6vNsnMp02eP1ML0STr1xW/JNV9bb9GOubk9xs3udjM51G9sl53W8k+dZ5\nXL+dKZiWxn2Vj9G8j3tmOo3uk5ni4Z7zzM9+mWdMfiPTDMQF85juf5V3+mqPzDRbdnGmz7st/l9r\nN8s0I3Rppmj+y/nzi1fM99md5EOZHp+/znRp+PV4YJKzu/vV3X3h0q9MF1f5njk2kim2L52/fvd8\ne0Xzc+XP8pXn8Er+KMmpVXX9Fe7/xlU+E/XLmS7Y8YK68v9f9ujlG88xd6dMs0N/MC++T6bPab5y\n/n7+LtOpi8s/U7e0j/O7+0r/2XpVfXOmcDo+yX8tH8+82aMyXazjyQvrVvzvGVY7zsLxbptp9nu1\n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\nAAC2nzVDrbsvSHLB/PVnqurcJMdu9sAAAAC2q/36jFpV7UpyqyRvnhc9vKreUVVPqarrbvDYAAAA\ntqV1h1pVXSvJ85P8UndfkuSvknxrkt2ZZtwet8r9Tq2qvVW1d9++fRswZAAAgMPbukKtqo7MFGlP\n7+4XJEl3f7y7r+juLyV5UpLjVrpvd5/R3Xu6e8/OnTs3atwAAACHrfVc9bGSPDnJud39JwvLj1nY\n7EeSnLPxwwMAANh+1nPVx9sleWCSd1bV2fOyRyd5QFXtTtJJzkvykE0ZIQAAwDaznqs+vjFJrbDq\nFRs/HAAAAPbrqo8AAABsPqEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAw\nGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEG\nAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAw\nGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEGAAAwGKEG\nAAAwGKEGAAAwGKEGAAAwGKEGAAAwmB1bPQAAANiOdp328q0ewmHlvNNP3uohbCgzagAAAIMRagAA\nAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMR\nagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAA\nAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAINZM9Sq6sZV9bqqOreq3lVVj5yXX6+qXlNV\n75t/v+7mDxcAAODwt54ZtcuTPKq7vzPJ8UkeVlW3SHJaktd2982SvHa+DQAAwEFaM9S6+4Luftv8\n9WeSnJvk2CT3SnLmvNmZSe69WYMEAADYTvbrM2pVtSvJrZK8OckNuvuCZIq5JNff6MEBAABsR+sO\ntaq6VpLnJ/ml7r5kP+53alXtraq9+/btO5AxAgAAbCvrCrWqOjJTpD29u18wL/54VR0zrz8myUUr\n3be7z+juPd29Z+fOnRsxZgAAgMPaeq76WEmenOTc7v6ThVUvSXLK/PUpSV688cMDAADYfnasY5vb\nJXlgkndW1dnzskcnOT3Jc6rqZ5J8OMn9NmeIAAAA28uaodbdb0xSq6w+cWOHAwAAwH5d9REAAIDN\nJ9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QA\nAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAG\nI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QA\nAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAG\nI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QA\nAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAG\nI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGI9QAAAAGs2ao\nVdVTquqiqjpnYdljqupjVXX2/OsemztMAACA7WM9M2pPTXLSCssf392751+v2NhhAQAAbF9rhlp3\n/1OSTx2CsQAAAJCD+4zaw6vqHfOpkdfdsBEBAABscwcaan+V5FuT7E5yQZLHrbZhVZ1aVXurau++\nffsO8HAAAADbxwGFWnd/vLuv6O4vJXlSkuOuYtszuntPd+/ZuXPngY4TAABg2zigUKuqYxZu/kiS\nc1bbFgAAgP2zY60NquqZSU5IcnRVfTTJbyU5oap2J+kk5yV5yCaOEQAAYFtZM9S6+wErLH7yJowF\nAACAHNxVHwEAANgEQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0A\nAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAw\nQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0A\nAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAw\nQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0A\nAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAw\nQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0AAGAwQg0A\nAGAwQg0AAGAwQg0AAGAwa4ZaVT2lqi6qqnMWll2vql5TVe+bf7/u5g4TAABg+1jPjNpTk5y0bNlp\nSV7b3TdL8tr5NgAAABtgzVDr7n9K8qlli++V5Mz56zOT3HuDxwUAALBtHehn1G7Q3Rckyfz79Vfb\nsKpOraq9VbV33759B3g4AACA7WPTLybS3Wd0957u3rNz587NPhwAAMDXvAMNtY9X1TFJMv9+0cYN\nCQAAYHs70FB7SZJT5q9PSfLijRkOAAAA67k8/zOT/EuSm1fVR6vqZ5KcnuQuVfW+JHeZbwMAALAB\ndqy1QXc/YJVVJ27wWAAAAMghuJgIAAAA+0eoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEao\nAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAA\nDEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEao\nAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAA\nDEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEao\nAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAADEaoAQAA\nDEaoAQAADGbHVg9gRLtOe/lWD+Gwct7pJ2/1EAAA4GuKGTUAAIDBCDUAAIDBCDUAAIDBCDUAAIDB\nCDUAAIDBCDUAAIDBCDUAAIDBCDUAAIDBCDUAAIDBCDUAAIDBCDUAAIDB7DiYO1fVeUk+k+SKJJd3\n956NGBQAAMB2dlChNvvB7v7EBuwHAACAOPURAABgOAcbap3k1VX11qo6daUNqurUqtpbVXv37dt3\nkIcDAAA4/B1sqN2uu783yd2TPKyq7rB8g+4+o7v3dPeenTt3HuThAAAADn8HFWrdff78+0VJXpjk\nuI0YFAAAwHZ2wKFWVd9QVdde+jrJXZOcs1EDAwAA2K4O5qqPN0jywqpa2s8zuvuVGzIqAACAbeyA\nQ627P5jklhs4FgAAAOLy/AAwvIbkAAAFNElEQVQAAMMRagAAAIMRagAAAIMRagAAAIMRagAAAIMR\nagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAA\nAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMR\nagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAA\nAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMR\nagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAA\nAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIMR\nagAAAIMRagAAAIMRagAAAIMRagAAAIMRagAAAIM5qFCrqpOq6j1V9f6qOm2jBgUAALCdHXCoVdUR\nSf4iyd2T3CLJA6rqFhs1MAAAgO3qYGbUjkvy/u7+YHd/McmzktxrY4YFAACwfVV3H9gdq+6b5KTu\n/tn59gOT3Ka7H75su1OTnDrfvHmS9xz4cFnm6CSf2OpBwAo8NxmV5yYj8/xkVJ6bG+sm3b1zrY12\nHMQBaoVlV6q+7j4jyRkHcRxWUVV7u3vPVo8DlvPcZFSem4zM85NReW5ujYM59fGjSW68cPtGSc4/\nuOEAAABwMKH2liQ3q6pvqaqrJbl/kpdszLAAAAC2rwM+9bG7L6+qhyd5VZIjkjylu9+1YSNjPZxS\nyqg8NxmV5yYj8/xkVJ6bW+CALyYCAADA5jio//AaAACAjSfUAAAABiPUAAAABiPUgINWVd9RVSdW\n1bWWLT9pq8YESVJVx1XVreevb1FVv1xV99jqccFyVfW3Wz0GWElV/cD8d+ddt3os242LiRwGquqn\nuvtvtnocbE9V9YgkD0tybpLdSR7Z3S+e172tu793K8fH9lVVv5Xk7pmucPyaJLdJclaSOyd5VXc/\ndutGx3ZWVcv/O6NK8oNJ/jFJuvuHD/mgYFZV/9bdx81f/1ymf+NfmOSuSV7a3adv5fi2E6F2GKiq\nD3f3N2/1ONiequqdSW7b3ZdW1a4kz0vytO5+QlW9vbtvtaUDZNuan5u7k1w9yYVJbtTdl1TVNZO8\nubu/Z0sHyLZVVW9L8h9J/jpJZwq1Z2b6P2nT3a/futGx3S3+211Vb0lyj+7eV1XfkORfu/t/bO0I\nt48D/n/UOLSq6h2rrUpyg0M5FljmiO6+NEm6+7yqOiHJ86rqJpmen7BVLu/uK5JcVlUf6O5LkqS7\nP1dVX9risbG97UnyyCS/nuRXuvvsqvqcQGMQX1dV1830Eanq7n1J0t2frarLt3Zo24tQ+9pxgyR3\nS/LpZcsryT8f+uHAl11YVbu7++wkmWfW7pnkKUm868ZW+mJVfX13X5bk+5YWVtV1kgg1tkx3fynJ\n46vqufPvH4/XZIzjOknemuk1ZlfVN3X3hfPn0L0Bewj5S+Frx8uSXGvpxfCiqjrr0A8HvuxBSb7q\nHbbuvjzJg6rq/23NkCBJcofu/kLy5RfGS45McsrWDAm+ors/muR+VXVykku2ejyQJN29a5VVX0ry\nI4dwKNuez6gBAAAMxuX5AQAABiPUAAAABiPUAAAABiPUAAAABiPUAAAABvP/AUQuVLvr9ol0AAAA\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a8be5ef98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_user('A1RRMZKOMZ2M7J')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Most popular words used by the user for different ratings are observed. (2-grams and 3-grams are chosen for analysis)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_token_ngram(score, benchmark, userid='all'):\n",
    "\n",
    "    if userid != 'all':\n",
    "        df = reviews[(reviews['reviewerID'] == userid) & (reviews['overall'] == score)]['reviewText']\n",
    "    else:\n",
    "        df = reviews[reviews['overall'] == score]['reviewText']\n",
    "        \n",
    "    count = len(df)\n",
    "    total_text = ' '.join(df)\n",
    "    total_text = total_text.lower()\n",
    "    stop = set(stopwords.words('english'))\n",
    "    total_text = nltk.word_tokenize(total_text)\n",
    "    total_text = [word for word in total_text if word not in stop and len(word) >= 3]\n",
    "    lemmatizer = WordNetLemmatizer()\n",
    "    total_text = [lemmatizer.lemmatize(w,'v') for w in total_text]\n",
    "    bigrams = ngrams(total_text,2)\n",
    "    trigrams = ngrams(total_text, 3)\n",
    "\n",
    "    # look at 2-gram and 3-gram together\n",
    "    combine = chain(bigrams, trigrams)\n",
    "    text = nltk.Text(combine)\n",
    "    fdist = nltk.FreqDist(text)\n",
    "    \n",
    "    # return only phrase occurs more than benchmark of his reviews\n",
    "    return sorted([(w,fdist[w],str(round(fdist[w]/count*100,2))+'%') for w in set(text) if fdist[w] >= count*benchmark], key=lambda x: -x[1])\n",
    "\n",
    "# score 1-5 reviews with this user\n",
    "index = ['Phrase', 'Count', 'Occur %']\n",
    "\n",
    "for j in range(1,6):\n",
    "    test = pd.DataFrame()\n",
    "    d = get_token_ngram(j, 0.25, 'A2P739KOM4U5JB')\n",
    "    print('score {} reviews most popular 2-gram / 3-gram:'.format(j))\n",
    "    for i in d:\n",
    "        test = test.append(pd.Series(i, index = index), ignore_index = True)\n",
    "    #test = test.sort_values('Count', ascending=False)\n",
    "    print(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, the popular words for all users are observed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# score 1-5 reviews with all users\n",
    "index = ['Phrase', 'Count', 'Occur %']\n",
    "\n",
    "for j in range(1,6):\n",
    "    test = pd.DataFrame()\n",
    "    # easier benchmark since we have many different users here, thus different phrase\n",
    "    d = get_token_ngram(j, 0.03)\n",
    "    print('score {} reviews most popular 2-gram / 3-gram:'.format(j))\n",
    "    for i in d:\n",
    "        test = test.append(pd.Series(i, index = index), ignore_index = True)\n",
    "    test = test.sort_values('Count', ascending=False)\n",
    "    print(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, only the adjectives are taken into consideration, as those express opinion and nouns don't."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_token_adj(score, benchmark, userid='all'):\n",
    "    \n",
    "    if userid != 'all':\n",
    "        df = reviews[(reviews['reviewerID'] == userid) & (reviews['overall'] == score)]['reviewText']\n",
    "    else:\n",
    "        df = reviews[reviews['overall'] == score]['reviewText']\n",
    "        \n",
    "    count = len(df)\n",
    "    total_text = ' '.join(df)\n",
    "    total_text = total_text.lower()\n",
    "    stop = set(stopwords.words('english'))\n",
    "    total_text = nltk.word_tokenize(total_text)\n",
    "    total_text = [word for word in total_text if word not in stop and len(word) >= 3]\n",
    "    lemmatizer = WordNetLemmatizer()\n",
    "    total_text = [lemmatizer.lemmatize(w,'a') for w in total_text]\n",
    "    # get adjective only\n",
    "    total_text = [word for word, form in nltk.pos_tag(total_text) if form == 'JJ']\n",
    "    \n",
    "    text = nltk.Text(total_text)\n",
    "    fdist = nltk.FreqDist(text)\n",
    "    \n",
    "    # return only phrase occurs more than benchmark of his reviews\n",
    "    return sorted([(w,fdist[w],str(round(fdist[w]/count*100,2))+'%') for w in set(text) if fdist[w] >= count*benchmark], key=lambda x: -x[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "score 1 reviews most popular adjectives word:\n",
      "    Count  Occur %       Phrase\n",
      "0     8.0  114.29%         hair\n",
      "2     6.0   85.71%          dry\n",
      "1     6.0   85.71%         good\n",
      "3     4.0   57.14%         long\n",
      "4     3.0   42.86%        great\n",
      "5     3.0   42.86%    immediate\n",
      "6     3.0   42.86%       sticky\n",
      "12    2.0   28.57%        silky\n",
      "15    2.0   28.57%  disclaimer-\n",
      "14    2.0   28.57%       strong\n",
      "13    2.0   28.57%      several\n",
      "8     2.0   28.57%         fine\n",
      "11    2.0   28.57%          hot\n",
      "10    2.0   28.57%          big\n",
      "9     2.0   28.57%         hard\n",
      "7     2.0   28.57%      shampoo\n",
      "16    2.0   28.57%        short\n",
      "score 2 reviews most popular adjectives word:\n",
      "   Count Occur %   Phrase\n",
      "0   18.0  78.26%    great\n",
      "1   14.0  60.87%     good\n",
      "2   14.0  60.87%     hair\n",
      "3   10.0  43.48%      dry\n",
      "4    8.0  34.78%   little\n",
      "5    6.0  26.09%     flat\n",
      "6    6.0  26.09%     soft\n",
      "7    6.0  26.09%  several\n",
      "score 3 reviews most popular adjectives word:\n",
      "   Count Occur %  Phrase\n",
      "0   15.0   75.0%     dry\n",
      "1   14.0   70.0%   great\n",
      "2   10.0   50.0%  little\n",
      "3    7.0   35.0%    good\n",
      "4    6.0   30.0%    high\n",
      "5    5.0   25.0%    fine\n",
      "6    5.0   25.0%    nice\n",
      "score 4 reviews most popular adjectives word:\n",
      "   Count Occur %  Phrase\n",
      "0   33.0   82.5%   great\n",
      "1   25.0   62.5%    good\n",
      "2   19.0   47.5%    hair\n",
      "3   16.0   40.0%     dry\n",
      "4   15.0   37.5%    much\n",
      "5   13.0   32.5%  little\n",
      "6   12.0   30.0%   clean\n",
      "7   10.0   25.0%    soft\n",
      "8   10.0   25.0%    nice\n",
      "score 5 reviews most popular adjectives word:\n",
      "   Count Occur %  Phrase\n",
      "0   28.0  103.7%   great\n",
      "1   14.0  51.85%    good\n",
      "2   13.0  48.15%    hair\n",
      "3   11.0  40.74%    nice\n",
      "4   10.0  37.04%  little\n",
      "5    9.0  33.33%   fresh\n",
      "6    8.0  29.63%    much\n",
      "7    7.0  25.93%    easy\n"
     ]
    }
   ],
   "source": [
    "# score 1-5 reviews with this user\n",
    "index = ['Phrase', 'Count', 'Occur %']\n",
    "\n",
    "for j in range(1,6):\n",
    "    test = pd.DataFrame()\n",
    "    d = get_token_adj(j, 0.25, 'A2P739KOM4U5JB')\n",
    "    print('score {} reviews most popular adjectives word:'.format(j))\n",
    "    for i in d:\n",
    "        test = test.append(pd.Series(i, index = index), ignore_index = True)\n",
    "    test = test.sort_values('Count', ascending=False)\n",
    "    print(test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sentiment analysis is performed using logistic regression and support vector machines. The usage of non-contextual features in reviews is observed. Also, the user behavior is analyzed and the popular words used by the users are determined. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
